В Rails 3, response_to и format.all работают иначе, чем Rails 2? - PullRequest
24 голосов
/ 09 сентября 2010

код

respond_to do |format|
  format.html
  format.json { render :json => @switches }
  format.xml { render :xml => @switches.to_xml }
  format.all { render :text => "only HTML, XML, and JSON format are supported at the moment." }
end

вышеописанное будет работать в Rails 2.2.2.Но в Rails 3 получение controller / index.html или index в браузере попадет в последнюю строку: «на данный момент поддерживаются только форматы HTML и JSON».

Единственный документ Rails, который я могу найтина это

http://api.rubyonrails.org/classes/ActionController/MimeResponds/ClassMethods.html#method-i-respond_to

, который в настоящее время только состояния:

respond_to :html, :xml, :json

, но им нужны отдельные шаблоны для json и xml, и они не могут обрабатывать только "HTML и JSON формат поддерживаются на данный момент "case.

Ответы [ 3 ]

43 голосов
/ 15 апреля 2011

В rails3 вы бы написали:

respond_with(@switches) do |format|
  format.html
  format.json { render :json => @switches }
  format.xml  { render :xml  => @switches }
  format.all  { render :text => "only HTML, XML, and JSON format are supported at the moment." }
end

Но это работает только в соответствии с блоком respond_to в верхней части файла, детализируя ожидаемые форматы.Например,

respond_to :xml, :json, :html

Даже в этом случае, если кто-нибудь, например, спросит формат js, будет запущен блок any.

Вы также можете использовать только respond_to, следующим образом:

@switches = ...
respond_to do |format|
  format.html {render :text => 'This is html'}
  format.xml  {render :xml  => @switches}
  format.json {render :json => @switches}
  format.all  {render :text => "Only HTML, JSON and XML are currently supported"}
end

Надеюсь, это поможет.

3 голосов
/ 10 сентября 2010

Возможно, вам будет полезно посмотреть этот эпизод Railscasts, который иллюстрирует изменения в контроллерах в Rails 3 и, в частности, изменения в классе респондента (помещая response_to в сам класс контроллера и используя только response_with @object в действии):

http://railscasts.com/episodes/224-controllers-in-rails-3

0 голосов
/ 16 апреля 2011

У меня работает следующее.Я полагаю, что вы должны явно указать часть "render" для html, иначе он будет использовать format.any.

...