web-dev-qa-db-fra.com

rails ressource singulière encore plurielle?

J'ai un itinéraire de recherche que je voudrais rendre singulier mais quand je spécifie un itinéraire singulier, il fait toujours plusieurs itinéraires de contrôleur, est-ce ainsi qu'il est censé être?

resource :search

Donne moi

 search POST        /search(.:format)        {:action=>"create", :controller=>"searches"}
 new_search  GET    /search/new(.:format)    {:action=>"new", :controller=>"searches"}
 edit_search GET    /search/edit(.:format)   {:action=>"edit", :controller=>"searches"}
             GET    /search(.:format)        {:action=>"show", :controller=>"searches"}
             PUT    /search(.:format)        {:action=>"update", :controller=>"searches"}
             DELETE /search(.:format)        {:action=>"destroy", :controller=>"searches"}

Le contrôleur pluriel "recherche"

Je n'ai vraiment qu'un seul itinéraire ... pour créer une recherche:

J'ai donc fait: match "search" => "search#create"

Je me demande juste pour l'avenir si je suis toujours censé garder le contrôleur au pluriel? Rails 3.0.9

37
holden

Oui, c'est comme ça que ça devrait être. Citation du Rails Guide sur le routage:

Étant donné que vous souhaiterez peut-être utiliser le même contrôleur pour une route singulière (/ account) et une route plurielle (/ accounts/45), les ressources singulières sont mappées sur plusieurs contrôleurs.

http://edgeguides.rubyonrails.org/routing.html#singular-resources

35
M. Cypher

Vous pouvez résoudre ce problème en définissant le pluriel de "recherche" comme indénombrable dans config/initializers/inflections.rb

ActiveSupport::Inflector.inflections do |inflect|
   inflect.uncountable %w( search )
end

Cela devrait maintenant permettre à la recherche d'être utilisée uniquement

23
Yule

La recherche est-elle vraiment une ressource? Si c'est le cas, alors ce que vous créez est une instance d'un modèle avec un type de "recherche", auquel cas le contrôleur pluriel "recherche" est parfaitement logique.

Cependant, si c'est un contrôleur qui n'a pas plusieurs modèles, alors peut-être pas. Dans ce cas, vous n'avez pas besoin de définir les routes avec resource :search vous pouvez simplement utiliser get 'search/create' pour dire au routeur de répondre "rechercher/créer" à l'action "créer" dans votre contrôleur "recherche".

6
Matt Connolly

Voulez-vous qu'un seul itinéraire soit généré pour la création?

Si c'est le cas:

resource :search, :only => :create

Le fait que le contrôleur de la ressource REST est nommé search_controller est une convention (que vous pouvez modifier en forçant le nom du contrôleur dans l'itinéraire avec resource :search, :only => :create, :controller => :search, mais ça ne vaut pas le coup ...).

6
Andrea Salicetti