2011-01-26 15 views
34

Con el enrutamiento predeterminado, la solicitud/mensajes /: id se asigna a la acción "mostrar" con :format => "html". Estoy usando algunos elementos xhtml en mi acción show que no se renderizan correctamente a menos que: content_type esté establecido en xml. Actualmente estoy recibiendo alrededor de esto haciendo show.xml.erb y ajuste de la content_type manualmente de la siguiente manera:¿Cómo establecer el formato predeterminado para una ruta en Rails?

format.html { render :template => "/posts/show.xml.erb", 
      :locals => {:post => @post}, :content_type => "text/xml" } 

Esto parece una tontería sin embargo. ¿Cómo puedo cambiar routes.rb para que/posts /: id se enrute con format=>"xml"? Gracias.

+0

su pregunta es confusa sobre el modelo: ¿tiene parcelas o publicaciones? – tomeduarte

+0

Vaya, disculpe. su único modelo, llámalo publicaciones. – Saucerful

Respuesta

76

formato predeterminado para las solicitudes:

Se puede ajustar el formato predeterminado de una ruta dada a xml usando el hash predeterminado.

Ejemplos:

# single match defaulting to XML (/plots/1 is the same as /plots/1.xml) 
match 'posts/:id' => 'posts#show', :defaults => { :format => 'xml' } 

# using resources, defaulting to XML (all action use XML by default) 
resources :posts, :defaults => { :format => 'xml' } 

# using resources and mixing with other options 
resources :posts, 
      :only => [:new, :create, :destroy], 
      :defaults => { :format => 'xml' } 

Es siempre una buena idea para buscar en la official Ruby on Rails routing guide, es bastante profundo y un muy buen primer punto de referencia para cualquier problema de enrutamiento.

+9

También puede establecer el formato predeterminado para un espacio de nombres y similares: 'namespace: user,: defaults => {: format => 'json'}' –

+0

Awesome. Sin el formato establecido anteriormente, recibía 406 errores al solicitar xml, aunque todo lo demás estaba bien en el controlador. – Polsonby

19

Si sólo desea apoyar un formato y tratar a todas las peticiones como ese formato, se puede usar un filtro para cambiarlo:

before_filter :set_format 

def set_format 
    request.format = 'xml' 
end 
+0

¿Este código va en el controlador? – Saucerful

+1

Sí. Si opta por utilizar esta solución en lugar de la ruta (ver mi respuesta), debe establecer el filtro como un método privado, por cuestiones de seguridad. - tenga en cuenta que esto fuerza el formato como no lo hace el camino, simplemente establece el valor predeterminado. – tomeduarte

6

rieles 5: En el controlador (por ejemplo, si toda ApplicationController toda aplicación utiliza el mismo formato) añadir siguiente:

before_action :set_default_request_format 

    def set_default_request_format 
    request.format = :json unless params[:format] 
    end 

Para Carriles 4 mayores de uso before_filter en lugar de before_action.

2

Estoy encontrando un comportamiento extraño en los carriles 5 si se utiliza este:

{ format: :json } 

En su config/routes.rb entonces incluso si JSON no se encuentra en el encabezado de aceptar, todavía coacciona a la petición de una solicitud JSON , incluidas las pruebas de controlador que tienen la opción as: :html establecida. No es realmente un gran problema para mí, así que no voy a investigar por qué sucede esto, pero si alguien se da cuenta, házmelo saber y actualizaré esta respuesta.

+0

Estoy viendo lo mismo. Bastante molesto. – turboladen

0

Si desea establecer el formato predeterminado para una ruta, utilice defaults opción:

resources :posts, defaults: { format: 'xml' } 

Pero si quiere cumplir todas las peticiones para devolver un formato específico, utilice constraints opción:

resources :posts, constraints: lambda { |req| req.format = 'xml' } 

Ver la documentación: http://edgeguides.rubyonrails.org/routing.html#request-based-constraints

Cuestiones relacionadas