2010-07-27 8 views
10

J'ai deux classes:Rails 3 has_one routage

class User < ActiveRecord::Base 
    :has_one :foo 
end 

class Foo < ActiveRecord::Base 
    :belongs_to :user 
end 

Le Foo est en option.

J'ai créé le routage suivant:

resources :users do 
    resources :foo 
end 

Quels sont les résultats les routes suivantes:

GET /users/:user_id/foo(.:format)    {:controller=>"foos", :action=>"index"} 
user_foos POST /users/:user_id/foo(.:format)    {:controller=>"foos", :action=>"create"} 
new_user_foo GET /users/:user_id/foo/new(.:format)   {:controller=>"foos", :action=>"new"} 
GET /users/:user_id/foo/:id(.:format)   {:controller=>"foos", :action=>"show"} 
PUT /users/:user_id/foo/:id(.:format)   {:controller=>"foos", :action=>"update"} 
user_foo DELETE /users/:user_id/foo/:id(.:format)   {:controller=>"foos", :action=>"destroy"} 
edit_user_foo GET /users/:user_id/foo/:id/edit(.:format)  {:controller=>"foos", :action=>"edit"} 

Questions:

  1. Il semble que l'indice et Afficher les actions sont redondants. L'un d'eux devrait-il être retiré? Si oui, lequel? Le paramètre: id dans l'action Afficher semble inutile, car id_utilisateur est une clé étrangère dans la table foos et il n'y a qu'un foo par utilisateur. Est-ce que je me trompe?
  2. Je voudrais avoir un moyen gracieux de router vers l'action Nouvelle s'il n'y a pas de truc. Une option serait de tester @ user.foo.nil? dans l'action Afficher ou index du FooController, redirigez vers l'action Nouvelle. Y a-t-il un meilleur moyen?

Merci pour votre temps.

Répondre

25

Si votre modèle a une association has_one, essayez de configurer l'itinéraire en utilisant resource :foo (notez le nom de la méthode singulière "resource", pas "resources"). Cela mettra en place une route de ressources singleton (qui, par exemple, n'a pas d'action d'index et les actions des membres n'ont pas de paramètre d'identification puisqu'il n'y a qu'un seul membre). Voir aussi http://apidock.com/rails/ActionController/Resources/resource (2.3 documentation, mais s'applique également à 3.0 ainsi qu'afaik).

+2

Je ne peux pas croire que j'ai raté ça. – craig

+1

Merci pour l'info –

2

Je peux comprendre pourquoi Craig l'a manqué en fait. C'est une différence si subtile qu'elle ne m'a même pas traversé l'esprit. La seule chose qui m'a signalé que mes itinéraires nommés pour la ressource singleton a un nom d'index étrange: user_foo_index au lieu de user_foos.

C'est une déduction très intelligente de l'absence de pluriel de la part de Rails.

Attention: Les exemples suivants utilisent imbrication peu profonde en faisant soit ceci:

resources :cats, shallow: true do 
    resources :noms 
end 

Ou que:

resources :cats do 
    shallow do 
    resources :noms 
    end 
end 

Quoi qu'il en soit de retour aux affaires, si vous configurez une ressource unique - Par exemple, par opposition à articles - et vous voyez quelque chose comme ceci:

user_address_index GET | POST 
    new_user_address GET 
     edit_address GET 
      address GET | PUT | DELETE 

Puis, comme Andreas a justement, vous probablement à tort déclaré dans vos itinéraires:

resources :users do 
    resources :address 
end 

Et si vous changiez cette:

resources :users do 
    resource :address 
end 

Vous devriez être bien et heureux et voir quelque chose comme ceci si vous poinçonner rake routes dans votre invite:

 user_address POST | GET | PUT | DELETE 
new_user_address GET 
edit_user_address GET 

Note: Je sais que la sortie de rakes routes ne ressemble pas exactement à cela (c'est beaucoup plus verbeux), je simplifie juste pour le focus.

Espérons que ça aide.