Подтвердить что ты не робот

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. Любые идеи?

4b9b3361

Ответ 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