2010-11-04 8 views
2

Ok, je suis relativement nouveau sur les rails et je travaille sur le Rails pour les programmeurs PHP. Pour rendre les choses intéressantes, j'utilise Rails 3 et haml pour travailler à travers le livre, et le livre est écrit en utilisant Rails 2.X et erb donc certains des exemples sont obsolètes.Rails 3 routage

A la question: L'exemple d'itinéraire dans le livre est

map.presentation 'meetings/:meeting_id/presentations/:action/:id', 
    :controller => "presentations", 
    :action => "show", 
    :meeting_id => /\d+/ 

C'était donc un pré-Rails 3 itinéraire. Mon adaptation de ce qui précède dans une route Rails 3 est:

match 'meetings/:meeting_id/presentations/:action/:id', :to => 'presentations#show', :constraints => {:id => /\d/} 

Mon adaptation fonctionne pour la détruire l'action, mais pas pour l'action d'édition ... et en raison de mon manque d'expérience, je ne sais pas ce que je suis mal faire. De l'article ici (http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/) il semble que je le fais bien, mais quelque chose ne va pas .

Les aides link_to qui produisent les urls sont les suivantes

= link_to 'edit', :controller => 'presentations', 
        :action  => 'edit', 
        :meeting_id => presentation.meeting.id, 
        :id   => presentation.id 
# Incorrectly Produces: http://localhost:3000/presentations/edit?meeting_id=2&id=1 

= link_to 'destroy', { :controller => 'presentations', 
         :action  => 'destroy', 
         :meeting_id => presentation.meeting.id, 
         :id   => presentation.id }, 
        :confirm => 'Are you sure?', 
        :method => :delete 
# Correctly Produces: http://localhost:3000/meetings/2/presentations/destroy/1 

Votre aide serait aller un long chemin à éclaircir mon trouble de routage. Merci beaucoup!

EDIT

Voici le fichier routes.rb non-travail dans son intégralité:

UserGroup::Application.routes.draw do 
    get "presentations/new" 
    get "presentations/edit" 
    get "sessions/new" 
    get "users/index" 
    get "users/show" 
    get "users/new" 
    get "users/edit" 
    get "meetings/index" 

    match '/meetings/show/:id', :to => 'meetings#show', :as => 'meeting' 
    match '/meetings/new', :to => 'meetings#new', :as => 'new_meeting' 
    match '/meetings/edit/:id', :to => 'meetings#edit', :as => 'edit_meeting' 

    match 'meetings/:meeting_id/presentations/:action/:id', :to => 'presentations', :constraints => {:id => /\d/} 

    #default route 
    match ':controller(/:action(/:id(.:format)))' 
end 

EDIT 2

Merci à codykrieger je pris un coup d'oeil au reste de le fichier des routes (je sais, duh non?). Apparemment, tous ces "..." itinéraires sont ajoutés lors de l'utilisation du générateur de rails et aider à faire quelques connexions par défaut dans l'application. J'ai commenté la ligne get "presentations/edit" et, merveille de merveilles, mon adaptation de routage fonctionne réellement.

Cela fonctionne:

UserGroup::Application.routes.draw do 
    get "presentations/new" 
    #get "presentations/edit" 
    get "sessions/new" 
    get "users/index" 
    get "users/show" 
    get "users/new" 
    get "users/edit" 
    get "meetings/index" 

    match '/meetings/show/:id', :to => 'meetings#show', :as => 'meeting' 
    match '/meetings/new', :to => 'meetings#new', :as => 'new_meeting' 
    match '/meetings/edit/:id', :to => 'meetings#edit', :as => 'edit_meeting' 

    match 'meetings/:meeting_id/presentations/:action/:id', :to => 'presentations', :constraints => {:id => /\d/} 

    #default route 
    match ':controller(/:action(/:id(.:format)))' 
end 

J'ai joué avec l'ordre des routes dans le fichier et a également constaté que si je mets ma route au-dessus de toutes les routes générées automatiquement, sans commenter la ligne get "presentations/edit", mon itinéraire a toujours l'effet escompté.

Cela fonctionne aussi:

UserGroup::Application.routes.draw do 

    match 'meetings/:meeting_id/presentations/:action/:id', :to => 'presentations', :constraints => {:id => /\d/} 

    get "presentations/new" 
    get "presentations/edit" 
    get "sessions/new" 
    get "users/index" 
    get "users/show" 
    get "users/new" 
    get "users/edit" 
    get "meetings/index" 

    match '/meetings/show/:id', :to => 'meetings#show', :as => 'meeting' 
    match '/meetings/new', :to => 'meetings#new', :as => 'new_meeting' 
    match '/meetings/edit/:id', :to => 'meetings#edit', :as => 'edit_meeting' 


    #default route 
    match ':controller(/:action(/:id(.:format)))' 
end 

Je pense que ce dernier est la meilleure façon d'aller et je devrais faire mes déclarations de routage personnalisées au-dessus de ceux standard générés, mais je ne suis pas sûr. Si quelqu'un là-bas veut commenter sur quelle pratique est meilleure, ou s'il vaut mieux supprimer complètement ceux qui sont générés si je veux spécifier le mien, j'aimerais l'entendre.

Merci à tous :)

+1

Que le reste de vos routes ressemblent-ils? – codykrieger

+0

@codykrieger - en affichant le reste du fichier routes.rb, j'ai trouvé que ma présentation # edit route avait déjà été prononcée via l'une des routes générées plus tôt dans le fichier. Grâce à vous, j'ai posté deux versions qui fonctionnent et je m'interroge maintenant sur une meilleure pratique concernant les routes générées. Merci beaucoup! –

+0

Bien sûr, heureux de l'entendre! :) – codykrieger

Répondre

1

Routing se fait sur une première base de correspondance (haut en bas) dans le fichier routes.rb. Ainsi, vous pouvez conserver toutes les routes comme vous l'avez fait ci-dessus si vous le souhaitez, et Rails utilisera le premier correspondant. Cependant, c'est malpropre, potentiellement buggy et totalement inutile. Donc les lignes "match ..." dans votre code devraient suffire, et vous pouvez supprimer les lignes "get ...".

En outre, votre "match de ... des présentations ...." ligne a un bug, il devrait être

...{:id => /\d+/} 

sinon il validera seulement 1 chiffres ids de longueur.

Enfin, dans la mesure où votre routes.rb globale est concerné, vous n'avez pas besoin de faire

link_to 'modifier',: controller => 'présentations', : action => 'modifier' , : MEETING_ID => presentation.meeting.id, : id => presentation.id

Au lieu de cela, vous devez utiliser edit_meeting_path, new_meeting_path etc. Par exemple

<%= link_to "New meeting", new_meeting_path %> 
<%= link_to "Edit meeting", edit_meeting_path(@meeting) %> 

Enfin, vous devriez lire Rails Routing from the Outside In des meilleures pratiques sur la façon de concevoir les routes imbriquées, etc.

+0

Merci Asif :) Je suis de plus en plus familier avec les guides de rails et votre lien est d'une grande aide! –