tutorial rails que ejemplos descargar curso caracteristicas aprender ruby-on-rails ruby-on-rails-3

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