2009-10-19 5 views
1

Je suis relativement nouveau à ruby ​​sur rails, donc cette question pourrait être facile. Rails fait beaucoup de magie et je ne sais pas trop où chercher de telles choses, parce que je ne sais pas quelle partie du cadre est à blâmer.map.resource et la convention de nommage pour singleton

J'ai essentiellement fait le authlogic_example et tripoté avec le code après. Mon routes.rb ressemble à ceci

map.root :controller => "user_session", :action => "new" # optional, this just sets the root route 
map.resources :users 
map.resource :user_session 

Comme vous pouvez le voir, j'ai un contrôleur appelé user_session. user_session a trois actions nouveau, créer et détruire. Je peux atteindre les contrôleurs à

localhost:3000/user_sessions/[new,destroy,create]. 

Je peux aussi atteindre la nouvelle action à

localhost:3000/user_session/new 

pour créer ou détruire j'obtiens une erreur de routage ici. Selon le documentation le premier cas devrait être le standard: "Un nom singulier est donné à map.resource Le nom de contrôleur par défaut est toujours pris du nom pluriel."

Mon problème est maintenant que link_to ne prend singulier du nom du contrôleur, où je ne peux atteindre de nouveaux, mais pas détruire

<%= link_to "singular", :controller=>"user_session", :action=>"destroy" %> 
#=> http://localhost:3000/user_session/destroy 
<%= link_to "plural", :controller=>"user_sessions", :action=>"destroy" %> 
#=> http://localhost:3000/user_session 

C'est assez confus et n'est pas encore à ce que je pensais, mais provoque aussi des problèmes: je ne peux pas

redirect_to :controller=>"user_sessions", :action=>"destroy" 

parce que je redirigés vers

http://localhost:3000/user_session 

Comme je l'ai déjà mentionné, je suis assez nouveau sur les rails, donc je ne pense pas encore à la bonne façon de penser. Pouvez-vous me montrer quelque chose qui décrit ce comportement? Comment pourrais-je résoudre ce problème?

Répondre

2

Le comportement que vous décrivez est correct. Au moins pour RESTful routing. Où l'action à effectuer est liée au type de requête.

Une demande POST sur http://localhost:3000/user_session va créer une session. Alors qu'une requête DELETE sur le même URI va détruire la session.

Si vous mappez des ressources, vous devriez utiliser les méthodes de commodité, pour en faire abstraction.

<%= link_to "Login", create_user_session_url %> 

Toutefois, map.resources ne fournit pas d'assistant de destruction. Donc, vous aurez soit à faire une ou mentionner explicitement: method =>: supprimer

<%= link_to "Logout", {:controller => "user_sessions", :action => :destroy}, :method => :destroy %> 

Je préfère la version de route nommée où cela va dans config/routes.rb

map.logout '/logout', :controller => "sessions" , :action => :destroy 

Ensuite, il suffit d'utiliser dans mes vues:

<%= link_to "Logout", logout_url %> 
+0

Works. Merci. ;-) – sebastiangeiger

Questions connexes