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}) 

或類似的東西調用它。