2009-01-23 4 views
4

Je crée une application Ruby on Rails qui se compose d'histoires. Chaque histoire a plusieurs pages.Rails situation simple routage

Comment puis-je mettre en place routes.rb afin que je puisse avoir des URL comme ceci:

http://mysite.com/[story id]/[page id] 

Comme:

http://mysite.com/29/46 

Actuellement, je suis en utilisant ce genre de configuration:

http://mysite.com/stories/29/pages/46 

Utilisation:

ActionController::Routing::Routes.draw do |map| 

    map.resources :stories, :has_many => :pages 
    map.resources :pages 

    map.root :controller => "stories", :action => "index" 

    map.connect ':controller/:action/:id' 
    map.connect ':controller/:action/:id.:format' 

end 

Merci à l'avance. Je suis un novice de Rails et le routage me semble un peu compliqué en ce moment.

Répondre

6

Here's une bonne ressource.

map.connect 'stories/:story_id/:page_num', :controller => "stories", :action => "index", :page_id => nil 

Dans votre contrôleur:

def index 
    story = Story.find(params[:story_id]) 
    @page = story.pages[params[:page_num]] 
end 

MISE À JOUR: Juste remarqué que vous ne voulez pas 'histoires' apparaissent. Je ne sais pas si cela tombera de la map.connect fonctionnera ... essayez-le.

map.connect '/:story_id/:page_num', ... 
+0

Merci! Je travaille toujours sur comment utiliser le contrôleur pour tirer la bonne page, mais vous m'avez mis sur la bonne voie, au moins. –

+0

Après avoir lu votre mise à jour ... map.connect « /: story_id /: page_id », ... fonctionne assez bien (notez la barre oblique au début) ... mais je ne sais pas où aller d'ici. –

1

Compte tenu de la voie d'

map.connect '/:story_id/:id', :controller => 'pages', :action => 'show' 

Vous pouvez le faire dans votre contrôleur

def show 
    @story = Story.find(:story_id) 
    @page = @story.pages.find(:id) 
end 

Maintenant vous pouvez obtenir la page en utilisant l'identifiant de l'histoire.

PS: map.connect ':story_id/:id'devrait fonctionner.

+0

Votre extrait de code n'est pas valide - vos deux appels trouvent le hachage params et passent juste le symbole. 'Story.find (: story_id)' devrait être 'Story.find (params [: story_id])' –

1

Je ne sais pas pourquoi personne n'a suggéré que l'utilisation d'une route nommée. Quelque chose comme

map.story '/:story_id/:page_id', :controller => 'stories', :action => 'show' 

alors vous pouvez l'appeler avec

story_path(story.id,params[:page}) 

ou quelque chose de similaire.

+0

Parce que Unniloct n'a pas posé de questions à ce sujet, il a demandé ce qu'il fallait faire pour obtenir l'histoire et la page, pas de lien avec lui. – Samuel