Рельсы - DRY reply_to с повторными действиями
В одном из контроллеров rails я должен отвечать на несколько типов форматов, поэтому я использую типичную цепочку respond_to
:
respond_to do |format|
format.html { ... }
format.mobile { ... }
format.jpg { ... }
format.xml { ... }
format.js { ... }
end
Обычно часть { ... }
повторяется в нескольких форматах. Каков наилучший способ остаться сухим в этом случае? В сценарии, в котором html
, mobile
и xml
имеют "повторяющееся" действие, я хотел бы сделать что-то вроде этого:
respond_to do |format|
format[:html, :mobile, :xml] { ... }
format.jpg { ... }
format.js { ... }
end
Большое спасибо.
Ответы
Ответ 1
Вы пробовали format.any(: html,: mobile,: xml)?
Пример (добавлен 2011/9/14)
Из рельсов doc
Ответьте также, чтобы указать общий блок для разных форматов, используя любой из них:
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
Ответ 2
Можете ли вы привести пример повторения, который вы видите?
Вы всегда можете сделать что-то вроде этого:
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 }) }
Сказав это, я думаю, что вам лучше с прежним, поскольку он более явный.