Lors du routage des ressources dans Rails, l'attribut de format facultatif est automatiquement ajouté aux routes générées. Ceci afin que la ressource en question puisse être demandée en XML, HTML, etc. Les formats réellement autorisés sont généralement décrits dans le contrôleur en utilisant respond_to
.Comment limiter les formats de ressources dans le fichier des itinéraires Rails
Cependant, dans la plupart des cas, vous ne voulez prendre en charge que le format HTML et vous avez l'impression d'écrire respond_to :html
dans chaque action de chaque contrôleur. Il serait donc cool s'il existe un moyen de limiter les types de contenu autorisés lors de la construction des routes dans le fichier routes.rb, par ex.
map.resources :users, :formats => :html
map.resources :users, :formats => [:html, :xml]
map.resources :users, :formats => {:index => :html, :show => [:html, :xml]}
Existe-t-il un moyen d'y parvenir soit natif, soit via un plugin?
P.S. La manière habituelle de contourner ce problème consiste simplement à ignorer le problème et à ne pas utiliser respond_to
dans les actions. Mais cela ne limite en réalité pas les types de contenu autorisés. Au lieu de cela, il s'attend simplement à ce qu'un modèle existe dans le répertoire views pour chaque type de contenu possible. Si l'un n'existe pas à la demande, le système lancera une erreur HTTP 500.
Non, une erreur 500 signifie quelque chose a mal tourné sur le serveur . Si un type de contenu n'est pas pris en charge, il ne s'agit pas d'une erreur de serveur: il s'agit d'une erreur client (le client ne devrait pas l'avoir demandé). Un 406 serait le code de réponse correct. Voir "Codes de réponse HTTP": http://www.sitepoint.com/blogs/2008/02/04/restful-rails-part-i/ –
Sûrement si vous allez marquer .xml ou .html à la fin de l'URL et ce format n'est pas supporté alors vous devriez retourner 404 non trouvé. Il semble un peu effronté d'ignorer l'utilisation de conneg en créant des URL pour chaque type de contenu, mais ensuite voler le code de réponse pour quand il n'y a pas de type de contenu valide dans l'en-tête accepter! –
Eh bien, vous pourriez avoir un point - même si c'est en fait comment Rails fonctionne hors de la boîte. Mais néanmoins ce n'est pas le point de ma question. Je voudrais toujours spécifier cela dans un emplacement central (de préférence le fichier de routes) - peu importe si puis un 404 ou un 406 est retourné sur erreur –