web-dev-qa-db-fra.com

Comment définir le format par défaut pour une route dans Rails?

Avec le routage par défaut, la requête/posts /: id est mappée à l'action "show" avec :format => "html". J'utilise des éléments xhtml dans mon action show qui ne sont pas restitués correctement à moins que le paramètre: content_type soit défini sur xml. Je contourne actuellement ceci en rendant show.xml.erb et en définissant manuellement le contenu_type comme suit:

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

Cela semble idiot cependant. Comment puis-je changer routes.rb pour que/posts /: id soit routé avec format=>"xml"? Merci.

37
Saucerful

Format par défaut pour les demandes:

Vous pouvez définir le format par défaut d'une route donnée sur xml à l'aide du hachage par défaut.

Exemples:

# 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' }

C'est toujours une bonne idée de consulter le guide officiel de routage Ruby on Rails , il est assez détaillé et constitue une très bonne ressource de premier arrêt pour tout problème de routage.

82
tomeduarte

Si vous souhaitez uniquement prendre en charge un format et traiter toutes les demandes comme ce format, vous pouvez utiliser un filtre pour le modifier:

before_filter :set_format

def set_format
  request.format = 'xml'
end
20
Jimmy Cuadra

Rails 4 et 5 : Dans votre contrôleur (par exemple, ApplicationController si toute l'application utilise le même format), ajoutez ce qui suit:

  before_action :set_default_request_format

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

Pour Rails 3 et versions antérieures, utilisez before_filter au lieu de before_action.

8
Tombart

Je trouve un comportement étrange dans Rails 5 si vous utilisez ceci:

{ format: :json }

Dans votre config/routes.rb, alors même si JSON n'est pas défini dans votre en-tête d'acceptation, il restitue la requête en requête JSON, y compris pour les tests de contrôleur avec l'option as: :html. Ce n'est pas vraiment un gros problème pour moi, alors je ne vais pas creuser pour comprendre pourquoi, mais si quelqu'un y parvient, faites-le-moi savoir et je mettrai à jour cette réponse. 

3
zachaysan

Si vous souhaitez définir le format par défaut pour une route, utilisez l'option defaults:

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

Mais si vous souhaitez appliquer chaque requête pour renvoyer un format spécifique, utilisez l'option constraints:

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

Voir la documentation: http://edgeguides.rubyonrails.org/routing.html#request-based-constraints

1
Son Dang