2010-11-17 15 views
3

J'essaie de restreindre un chemin dans mon fichier de routes à un format spécifique.Rails 3 Routes et spécificité de format

je veux que cela fonctionne: app.com/party_favors/list.json

pas

app.com/party_favors/list ou ce app.com/party_favors/list.html ou ce app.com/party_favors/list.asdasdasda

est-il un moyen simple pour permettre seulement un certain format dans une entrée de correspondance dans le fichier de routes?

Merci!

Répondre

1

Pour autant que je sais que vous pouvez gérer cela dans le contrôleur plutôt que les routes

respond_to do |format| 
    format.html 
    format.json { render :json => @abcd } 
    format.any { render :text => "Invalid format", :status => 403 } 
end 
3

Vous ne pouvez mapper explicitement comme cette

match 'party_favors/list.json', :controller => 'party_favors', :action => 'list', :format => 'json' 
+0

c'est ce que je pensais que je devrais être capable de faire, mais rake routes envoie un (.: Format) à la fin de la route générée:/ – skk5m

+0

Je pense que vous devrez définir tous les chemins et compter moins sur les générateurs –

0

J'ai fini par aller avec cette solution pour mon public 2 méthodes exposées. before filter option puisqu'il donne des 404s. Je souhaite vraiment qu'il y avait une façon plus propre de faire cela.

Merci à tous pour vos réponses. Je vous en suis reconnaissant. :)

2

J'ai trouvé ce qui suit à travailler pour moi (Rails 3.1.1)

match '/categories/:id.json'=>'categories#show', :format=>false, :defaults=>{:format=>'json'} 
11

Rails 3 fournit le :constraints option qui peut être spécifiée sur une route. Cela a fonctionné pour acheminer le même URL pour différents contrôleurs, selon le format:

# http://app.com/party_favors.html gets routed to Web::PartyFavorsController#index 
resources :party_favors, :module => "web", :constraints => {:format => :html} 

# http://app.com/party_favors.xml gets routed to PartyFavorsController#index 
resources :party_favors 

J'ai essayé l'option :requirements dans Rails 2, mais il ne semble pas être aussi flexible. Je ne suis pas au courant d'un moyen de le construire dans la route pour Rails 2, donc vous devez utiliser l'une des autres suggestions.

+0

cela ne limitera pas les demandes à ces formats, voir ma réponse ci-dessous pour l'implémentation correcte – koonse

4

Vous devez placer ces routes dans une portée si vous souhaitez les limiter à un format spécifique (par exemple, html ou json). Les contraintes ne fonctionnent malheureusement pas comme prévu dans ce cas.

Ceci est un exemple d'un tel bloc ...

scope :format => true, :constraints => { :format => 'json' } do 
    get '/bar' => "bar#index_with_json" 
end 

Plus d'informations peuvent être trouvées ici: https://github.com/rails/rails/issues/5548

Cette réponse est copiée de ma précédente réponse ici ..

Rails Routes - Limiting the available formats for a resource