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.
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.
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
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
.
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.
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