2009-01-23 75 views
4

我创建了一个由故事组成的Ruby on Rails应用程序。每个故事都有多个页面。简单的导轨路由情况

我如何设置的routes.rb这样我就可以有一个像这样的网址:

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

像:

http://mysite.com/29/46 

目前我使用这种设置的:

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

使用:

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 

在此先感谢。我是Rails的新手,现在对于我来说路由似乎有点复杂。

回答

6

Here's一个很好的资源。

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

在你的控制器:

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

更新:只注意到你不想 '故事' 的出现。不知道是否从map.connect中删除它会起作用...尝试一下。

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

谢谢!仍然在研究如何利用控制器来拉动正确的页面,但至少让我走上了正确的轨道。 – 2009-01-23 02:29:59

+0

在阅读您的更新之后... map.connect'/:story_id /:page_id',...效果不错(注意斜线在开头)......但我不知道该从哪里出发。 – 2009-01-23 02:47:00

1

鉴于

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

你能做到这一点的路线在控制器

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

现在你可以使用这个故事ID的页面。

PS:map.connect ':story_id/:id'应该工作。

+0

您的代码片段无效 - 您的查找调用都缺少参数散列并传递该符号。 `Story.find(:story_id)`应该是`Story.find(params [:story_id])` – 2009-01-23 13:43:10

1

我不知道为什么没有人建议只使用命名路线。像

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

的东西,那么你可以只是

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

或类似的东西调用它。