Rails send_file несколько стилей из Paperclip, как я могу избежать повторения кода?

Это код по умолчанию, который я использую в связанной модели для загрузки изображений из папки «Скрепка» в качестве 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

1
nl ja de
Есть много способов сделать это; код контроллера должен быть тривиальным для рефакторинга как есть. Вы также можете просто использовать больше параметров в маршрутизации вместо жесткого кодирования.
добавлено автор Dave Newton, источник
Есть много способов сделать это; код контроллера должен быть тривиальным для рефакторинга как есть. Вы также можете просто использовать больше параметров в маршрутизации вместо жесткого кодирования.
добавлено автор Dave Newton, источник

2 ответы

Рефакторинг вашего контроллера :

def download_iphone4
  send_file (myfile params, :iphone4), :disposition => 'attachment'
end

def download_iphone5
  send_file (myfile params, :iphone5), :disposition => 'attachment'
end 

def download_ipad ...
def download_1440 ...
def download_1680 ...
def download_1920 ...


private 

def myfile params, style
  @wallpaper = Wallpaper.find(params[:wallpaper_id])
  @month = @wallpaper.months.find(params[:id])
  'public/system/wallpaper_pictures/' + @month.id.to_s + "/#{style}/" [email protected]_picture_file_name
end

или, вы можете дополнительно сушить это с помощью своих модификаций маршрутов и контроллера как:

<�Сильный> routes.rb

match 'wallpaper/:wallpaper_id/download/:id/:style' => 'months#download', :as => :download

<�Сильный> контроллер </сильный>

def download
  send_file (myfile params), :disposition => 'attachment'
end 


private 

def myfile params
  @wallpaper = Wallpaper.find(params[:wallpaper_id])
  @month = @wallpaper.months.find(params[:id])
  'public/system/wallpaper_pictures/' + @month.id.to_s + "/#{params[:style]}/" [email protected]_picture_file_name
end

и генерировать путь из ваших представлений:

 = link_to 'iphone4', download_path(month.wallpaper_id, month.id,'iphone4') 
 = link_to 'iphone5', download_path(month.wallpaper_id, month.id,'iphone5') 

В обоих случаях вы можете переместить свой частный метод на модель обоев/месяц соответственно.


3) In the first and default method in the code there are some hashes like:

:filename => @month.wallpaper_picture_file_name, :type => @month.wallpaper_picture_content_type

But in the other method I realized I didn't need to use them. Are those hashes necessary?

: имя_файла дает вам контроль над тем, что будет именем файла файла, который вы отправляете в качестве вложения, вы можете изменить его и указать другое имя файла, чем фактического файла. По умолчанию он вернет вложение с его фактическим именем файла.

: type снова работает аналогично, вы можете заставить его использовать какой-либо другой тип контента; однако это не сильно повлияет, поскольку вы передаете файл уже как вложение.

Они не хеши, они являются ключевыми, значениями для хэшей или могут рассматриваться просто как атрибуты здесь.

3
добавлено
oh .. во втором случае вы можете иметь def myfile params только ... так как в этом случае style уже находится в параметрах ...
добавлено автор Rahul garg, источник
Просто вопрос, почему вы используете два слова 'myfile params'? Не нужно ли только «def myfile, style»?
добавлено автор Ricardo Castañeda, источник

Рефакторинг вашего контроллера :

def download_iphone4
  send_file (myfile params, :iphone4), :disposition => 'attachment'
end

def download_iphone5
  send_file (myfile params, :iphone5), :disposition => 'attachment'
end 

def download_ipad ...
def download_1440 ...
def download_1680 ...
def download_1920 ...


private 

def myfile params, style
  @wallpaper = Wallpaper.find(params[:wallpaper_id])
  @month = @wallpaper.months.find(params[:id])
  'public/system/wallpaper_pictures/' + @month.id.to_s + "/#{style}/" [email protected]_picture_file_name
end

или, вы можете дополнительно сушить это с помощью своих модификаций маршрутов и контроллера как:

<�Сильный> routes.rb

match 'wallpaper/:wallpaper_id/download/:id/:style' => 'months#download', :as => :download

<�Сильный> контроллер </сильный>

def download
  send_file (myfile params), :disposition => 'attachment'
end 


private 

def myfile params
  @wallpaper = Wallpaper.find(params[:wallpaper_id])
  @month = @wallpaper.months.find(params[:id])
  'public/system/wallpaper_pictures/' + @month.id.to_s + "/#{params[:style]}/" [email protected]_picture_file_name
end

и генерировать путь из ваших представлений:

 = link_to 'iphone4', download_path(month.wallpaper_id, month.id,'iphone4') 
 = link_to 'iphone5', download_path(month.wallpaper_id, month.id,'iphone5') 

В обоих случаях вы можете переместить свой частный метод на модель обоев/месяц соответственно.


3) In the first and default method in the code there are some hashes like:

:filename => @month.wallpaper_picture_file_name, :type => @month.wallpaper_picture_content_type

But in the other method I realized I didn't need to use them. Are those hashes necessary?

: имя_файла дает вам контроль над тем, что будет именем файла файла, который вы отправляете в качестве вложения, вы можете изменить его и указать другое имя файла, чем фактического файла. По умолчанию он вернет вложение с его фактическим именем файла.

: type снова работает аналогично, вы можете заставить его использовать какой-либо другой тип контента; однако это не сильно повлияет, поскольку вы передаете файл уже как вложение.

Они не хеши, они являются ключевыми, значениями для хэшей или могут рассматриваться просто как атрибуты здесь.

3
добавлено
oh .. во втором случае вы можете иметь def myfile params только ... так как в этом случае style уже находится в параметрах ...
добавлено автор Rahul garg, источник
Просто вопрос, почему вы используете два слова 'myfile params'? Не нужно ли только «def myfile, style»?
добавлено автор Ricardo Castañeda, источник
pro.ruby
pro.ruby
1 181 участник(ов)

Язык программирования Ruby Additional docs: https://rubyreferences.github.io/rubyref/ Invite: https://telegram.me/joinchat/Be4rsT2NuB3CyJaF26j1kA Кто хочет компилировать: @crystal_ru (его синтаксис основан на Ruby) Участник @proDOT

Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
1 180 участник(ов)

https://telegram.me/rubyjob - Ruby Job По вопросам - @eugene_shved

Ruby School .us
Ruby School .us
1 045 участник(ов)

Чат-болталка для учеников руби-школы и не только. Правила: https://telegra.ph/Pravila-chata-Rubi-shkoly-03-13

Random Ruby Chat
Random Ruby Chat
589 участник(ов)

Правила публикации вакансий: https://t.me/codenamecrud/60865

Rubyata
Rubyata
333 участник(ов)

Коммюнити Ruby и Ruby On Rails Флуд не приветствуются. Вакансии можно публиковать только и ТОЛЬКО по пятницам с хештегом #вакансия.

Ruby Talks
Ruby Talks
236 участник(ов)

Национальная Флеймотека

RubyRush
RubyRush
189 участник(ов)

rubyrush.ru программирование для самых новичков

Rails Chat
Rails Chat
87 участник(ов)

You are welcome to discuss Ruby On Rails development process and other stuff