В Rails 3, response_to и format.all работают иначе, чем Rails 2?
код
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 получение контроллера /index.html или индекса в браузере обойдется в последнюю строку: "В настоящий момент поддерживаются только формат 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-формат в данный момент".
Ответы
Ответ 1
В 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
Надеюсь, что это поможет.
Ответ 2
Вам может показаться полезным посмотреть этот эпизод railscasts, который иллюстрирует изменения в контроллерах в Rails 3 и, в частности, изменения класса responder (поместить response_to в класс контроллера и только с помощью response_with @object в действии ):
http://railscasts.com/episodes/224-controllers-in-rails-3
Ответ 3
Следующие работы для меня. Я считаю, что вам нужно явно указать часть "render" для html или использовать format.any.
respond_to do |format|
format.html { render :html => @switches }
format.json { render :json => @switches }
format.xml { render :xml => @switches }
format.all { render :text => "we only have html, json, and xml" }
end