Это код по умолчанию, который я использую в связанной модели для
загрузки изображений из папки «Скрепка» в качестве save_to.
months_controller
def download
@wallpaper = Wallpaper.find(params[:wallpaper_id])
@month = @wallpaper.months.find(params[:id])
send_file @month.wallpaper_picture.path,
:filename => @month.wallpaper_picture_file_name,
:type => @month.wallpaper_picture_content_type,
:disposition => 'attachment'
end
routes
resources :wallpapers do
resources :months
end
match 'wallpaper/:wallpaper_id/download/:id' => 'months#download', :as => :download
view/months/index
- @months.each do |month|
= link_to 'default', download_path(month.wallpaper_id, month.id)
Но мое приложение имеет около 6 скрепки разных стилей,
объявленных в моей модели, и каждая из них должна быть загружаемой.
Для этого я сделал это (я покажу только 2 из 6 блоков кода):
months_controller
def download_iphone4
@wallpaper = Wallpaper.find(params[:wallpaper_id])
@month = @wallpaper.months.find(params[:id])
@month = 'public/system/wallpaper_pictures/' + @month.id.to_s + '/iphone4/' + @month.wallpaper_picture_file_name
send_file @month,
:disposition => 'attachment'
end
def download_iphone5
@wallpaper = Wallpaper.find(params[:wallpaper_id])
@month = @wallpaper.months.find(params[:id])
@month = 'public/system/wallpaper_pictures/' + @month.id.to_s + '/iphone5/' + @month.wallpaper_picture_file_name
send_file @month,
:disposition => 'attachment'
end
def download_ipad ...
def download_1440 ...
def download_1680 ...
def download_1920 ...
etc ...
routes
match 'wallpaper_pictures/:wallpaper_id/iphone4/:id' => 'months#download_iphone4', :as => :download_iphone4
match 'wallpaper_pictures/:wallpaper_id/iphone5/:id' => 'months#download_iphone5', :as => :download_iphone5
match 'wallpaper_pictures/:wallpaper_id/ipad4/:id' => 'months#download_ipad', :as => :download_ipad
match 'wallpaper_pictures/:wallpaper_id/1440/:id' => 'months#download_1440', :as => :download_1440
match 'wallpaper_pictures/:wallpaper_id/1680/:id' => 'months#download_1680', :as => :download_1680
match 'wallpaper_pictures/:wallpaper_id/1920/:id' => 'months#download_1920', :as => :download_1920
<�Сильный> вид/месяцев/индекс
- @months.each do |month|
= link_to 'iphone4', download_iphone4_path(month.wallpaper_id, month.id)
= link_to 'iphone5', download_iphone5_path(month.wallpaper_id, month.id)
= link_to 'ipad', download_ipad_path(month.wallpaper_id, month.id)
= link_to '1440', download_1440_path(month.wallpaper_id, month.id)
= link_to '1680', download_1680_path(month.wallpaper_id, month.id)
= link_to '1920', download_1920_path(month.wallpaper_id, month.id)
Вот мои вопросы:
1) Могу ли я сделать это чище/лучше?
2) Должен ли я переместить блоки с моего
контроллера на модель или новый контроллер?
3) В первом и по умолчанию методе в коде есть
некоторые хэши, такие как:
:filename => @month.wallpaper_picture_file_name,
:type => @month.wallpaper_picture_content_type
Но в другом методе я понял, что мне не нужно их использовать.
Необходимы ли эти хеши?
4) Я называю их «хэшерами». Правильно ли это?
Любая другая коррекция?
PD: если send_file не работает в Production, измените его на
send_data или
закомментируйте эту строку в config/production.rb
config.action_dispatch.x_sendfile_header = "X-Sendfile"
send_file just sends an empty file