направляющие - DRY respond_to с повторными действиями

В одном из моего контроллера направляющих я должен ответить на несколько типов форматов, таким образом, я использую типичное respond_to цепочка:

respond_to do |format|
  format.html   { ... }
  format.mobile { ... }
  format.jpg  { ... }
  format.xml  { ... }
  format.js   { ... }
end

Обычно то, что { ... } часть повторяется на нескольких форматах. Что лучший способ состоит в том, чтобы остаться DRY на этом случае? На сценарии, в который html, mobile и xml имейте "повторное" действие, я хотел бы сделать что-то вроде этого:

respond_to do |format|
  format[:html, :mobile, :xml] { ... }
  format.jpg  { ... }
  format.js   { ... }
end

Большое спасибо.

14
задан kikito 3 February 2010 в 17:58
поделиться

2 ответа

Вы пробовали format.any (: html,: mobile,: xml )?

Пример (добавлено 2011/9/14)

Из rails doc

Respond to также позволяет указать общий блок для разных форматов, используя любой:

def index
  @people = Person.all

  respond_to do |format|
    format.html
    format.any(:xml, :json) { render request.format.to_sym => @people }
  end
end

В примере выше, если формат xml, он будет отображать:

render :xml => @people

Или, если формат json:

render :json => @people
21
ответ дан 1 December 2019 в 10:18
поделиться

Вы можете привести пример повторения, которое вы видите?

Вы всегда можете сделать что-то вроде этого:

respond_to do |do|
  format.html { common_stuff }
  format.mobile { common_stuff }
  format.xml { common_stuff }
  ...
end

protected 

def common_stuff
  ...
end

Я думаю, что что-то подобное можно было бы реорганизовать (я, вероятно, ошибся, так как всегда забываю, как использовать метод в качестве блока:

[:html, :mobile, :xml].each { |f| format.send(:f, lambda{ common_stuff }) }

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

5
ответ дан 1 December 2019 в 10:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: