Rails 3 reply_to: формат по умолчанию?
Я конвертирую приложение Rails 2 в Rails 3. В настоящее время у контроллера есть следующие настройки:
class Api::RegionsController < ApplicationController
respond_to :xml, :json
end
с и действие, которое выглядит следующим образом:
def index
@regions = Region.all
respond_with @regions
end
Реализация довольно проста, api/regions, api/regions.xml и api/regions.json все реагируют так, как вы ожидали. Проблема в том, что я хочу, чтобы api/regions по умолчанию отвечали через XML. У меня есть потребители, которые ожидают ответа XML, и я бы не хотел, чтобы они меняли все свои URL-адреса, чтобы включить .xml, если это абсолютно необходимо.
В Rails 2 вы выполнили бы это:
respond_to do |format|
format.xml { render :xml => @region.to_xml }
format.json { render :json => @region.to_json }
end
Но в Rails 3 я не могу найти способ по умолчанию передать ответ XML. Любые идеи?
Ответы
Ответ 1
Если я понимаю, что вы пытаетесь сделать, вы, вероятно, можете решить проблему, установив формат ресурсов по умолчанию в XML. Это позволит вашим пользователям создавать запросы с использованием "api/regions" и отвечать по умолчанию на XML. Взгляните на разделы "Пространства имен и маршрутизация контроллера" и разделы "Определение по умолчанию" по адресу:
http://guides.rubyonrails.org/routing.html
Вы можете сделать что-то вроде следующих в route.rb:
namespace "api" do
resources :regions, :defaults => { :format => 'xml' }
end
Затем вы должны иметь следующую работу для своих методов контроллера:
class Api::RegionsController < ApplicationController
respond_to :xml, :json
def index
respond_with(@regions = Region.all)
end
end
Ответ 2
Сегодня я борюсь с этой проблемой, и я решил использовать решение before_filter
, которое вы упомянули в своем комментарии:
before_filter :default_format_xml
# Set format to xml unless client requires a specific format
# Works on Rails 3.0.9
def default_format_xml
request.format = "xml" unless params[:format]
end
Это решение также позволяет учитывать согласование контента, что было фактором в моем случае. Я хотел, чтобы веб-браузеры получали HTML-представление, но пользовательские клиенты (без заголовков Accept), чтобы получить JSON. Это решило мою проблему:
before_filter :default_format_json
def default_format_json
if(request.headers["HTTP_ACCEPT"].nil? &&
params[:format].nil?)
request.format = "json"
end
end
Ответ 3
Не то, что вам нужно, но связанное:
def index
@regions = Region.all
respond_to do |format|
format.json { render :json => @regions }
format.any(:xml, :html) { render :xml => @regions }
end
end
"Ответ также позволяет указать общий блок для разных форматов с помощью любого
Ответ 4
Простым, но уродливым решением является переопределить обработку содержимого содержимого HTML для рендеринга xml:
respond_to :html, :xml, :json
def index
@regions = Region.all
respond_with @regions do |format|
format.html { render :xml => @regions }
end
end