ruby-on-rails - ejemplos - ruby on rails que es
Rails 3 responde_ a: ¿formato predeterminado? (5)
Estoy convirtiendo una aplicación de Rails 2 en Rails 3. Actualmente tengo un controlador configurado de la siguiente manera:
class Api::RegionsController < ApplicationController
respond_to :xml, :json
end
con y una acción que se parece a lo siguiente:
def index
@regions = Region.all
respond_with @regions
end
La implementación es bastante sencilla, api / regions, api / regions.xml y api / regions.json responden como es de esperar. El problema es que quiero api / regions por defecto para responder a través de XML. Tengo consumidores que esperan una respuesta XML y me gustaría que cambien todas sus URL para incluir .xml a menos que sea absolutamente necesario.
En Rails 2 lograrías eso haciendo esto:
respond_to do |format|
format.xml { render :xml => @region.to_xml }
format.json { render :json => @region.to_json }
end
Pero en Rails 3 no puedo encontrar una forma de predeterminarlo a una respuesta XML. ¿Algunas ideas?
Bueno, como se ha señalado que cada formato debe representarse explícitamente con una llamada de renderización específica, también puede evitar cualquier solicitud con formato desconocido o no compatible, para mi ejemplo llamado predeterminado , de la siguiente manera:
rescue_from ActionController::UnknownFormat, with: ->{ render nothing: true }
Puede simular la llamada de formato desconocido con la línea simple del navegador (exmp.firefox) (en modo de desarrollo):
http://localhost/index.default
Llamará :index
método de :index
de un controlador raíz con formato llamado como predeterminado .
He estado luchando contra este problema hoy, y me conformé con la solución before_filter
que mencionaste en tu comentario:
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
Esta solución también permite tomar en cuenta la negociación de contenido, que fue un factor en mi caso. Quería que los navegadores web obtuvieran una vista HTML pero clientes personalizados (sin encabezados Aceptar) para obtener JSON. Esto resolvió mi problema:
before_filter :default_format_json
def default_format_json
if(request.headers["HTTP_ACCEPT"].nil? &&
params[:format].nil?)
request.format = "json"
end
end
No es lo que buscas sino relacionado:
def index
@regions = Region.all
respond_to do |format|
format.json { render :json => @regions }
format.any(:xml, :html) { render :xml => @regions }
end
end
"Responder también te permite especificar un bloque común para diferentes formatos usando cualquier"
Si entiendo lo que intenta hacer, probablemente pueda resolver el problema configurando el formato de recursos predeterminado en XML. Esto permitirá a los usuarios hacer solicitudes usando ''api / regions'' y tener la respuesta predeterminada a XML. Eche un vistazo a las secciones ''Controles de espacios de nombres y enrutamiento'' y ''Definición de valores predeterminados'' en:
http://guides.rubyonrails.org/routing.html
Puede hacer algo como lo siguiente en routes.rb:
namespace "api" do
resources :regions, :defaults => { :format => ''xml'' }
end
Entonces debería poder tener el siguiente trabajo para sus métodos de controlador:
class Api::RegionsController < ApplicationController
respond_to :xml, :json
def index
respond_with(@regions = Region.all)
end
end
Una solución fácil pero fea es anular el manejo del tipo de contenido html para renderizar xml:
respond_to :html, :xml, :json
def index
@regions = Region.all
respond_with @regions do |format|
format.html { render :xml => @regions }
end
end