рельсы - DRY response_to с повторными действиями - PullRequest
14 голосов
/ 03 февраля 2010

В одном из моих контроллеров 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

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

Ответы [ 2 ]

21 голосов
/ 12 марта 2010

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

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

Из рельсов док

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

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
5 голосов
/ 03 февраля 2010

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

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

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

protected 

def common_stuff
  ...
end

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

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

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

...