2009-12-03 8 views
2

je suit dans mon routes.rbaccès à une ressource en routes.rb en utilisant des attributs autres que Id

map.resources :novels do |novel| 
    novel.resources :chapters 
end 

Avec l'itinéraire défini ci-dessus, je peux accéder aux chapitres à l'aide xxxxx.com/novels/:id/chapters/:id. Mais ce n'est pas ce que je veux, le modèle de chapitre a un autre champ appelé numéro (qui correspond au numéro de chapitre). Je veux accéder à chaque chapitre à travers une URL qui est quelque chose comme xxxx.com/novels/:novel_id/chapters/:chapter_number. Comment puis-je accomplir ceci sans définir explicitement une route nommée?

En ce moment je fais cela en utilisant ce qui suit route nommée définie ci-dessus map.resources: romans

map.chapter_no 'novels/:novel_id/chapters/:chapter_no', :controller => 'chapters', :action => 'show' 

Merci.

Répondre

6

:id peut être presque tout ce que vous voulez. Donc, laissez les zones intactes config de routage et changer votre action de

class ChaptersControllers 
    def show 
    @chapter = Chapter.find(params[:id]) 
    end 
end 

à (en supposant que le champ que vous voulez rechercher est appelé :chapter_no)

class ChaptersControllers 
    def show 
    @chapter = Chapter.find_by_chapter_no!(params[:id]) 
    end 
end 

A noter également:

  1. I J'utilise le bang! Version Finder (find_by_chapter_no! au lieu de find_by_chapter_no) pour simuler le comportement par défaut find
  2. Le champ que vous recherchez doit avoir un indice de base de données pour de meilleures performances
+1

Je suis en train de faire la même chose, et j'ai une rancune avec cette méthode: show_chapter_url (chapitre) ne fonctionne plus. Y a-t-il un moyen de contourner cela, pensez-vous? Ou devrais-je juste créer et utiliser show_chapter_url (chapter.chapter_no) (ou en fait l'équivalent dans ma propre application)? – FrontierPsycho