2013-01-17 62 views
1

在Rails 3,這是我的願望,以創建一個URL結構,看起來像:實現友好的URL和多個嵌套資源

http://example.org/learn/cooking/cooking-101/can-anybody-cook 

,並對應於以下控制器:

http://example.org/learn/subject/module/lesson 

的協會將看起來像:

Subject has many Modules 
Module belongs to Subject 

Module has many Lessons 
Lessons belongs to Module 

瞭解僅僅是一個集線器或儀表盤,並會列出所有的科目。與其他控制器沒有關聯。

我知道,在RailsGuides,他們警告不要使多個嵌套的資源,像這樣:

resources :subjects do 
    resources :modules do 
    resources :lessons 
    end 
end 

這是對所有我知道的。我有點卡住了。有人可以幫我路由嗎?

回答

0

我會去這一點,而不是嵌套的資源,我不相信的樣子是必要的,這種情況下是爲每個科目,模塊和教訓創建自定義顯示的路線。

所以我設置的每個資源,如下所示:

resources :subjects, :except => [:show] 
resources :modules, :except => [:show] 
resources :lessons, :except => [:show] 

然後明確地匹配顯示路線:

match '/learn/:subject/:module/:lesson' => 'lessons#show', :as => 'show_lesson' 
match '/learn/:subject/:module' => 'modules#show', :as => 'show_module' 
match '/learn/:subject' => 'subjects#show', :as => 'show_subjects' 

這會給你更多的粒度爲定義爲展示途徑(這是您想要自定義url的正常操作)。

現在根據您的要求,您可能仍然想要嵌套資源,但希望這給你一些想法。

通過我的名字我與show_ show_xxx路線只是爲了澄清,他們命名路由,並避免的情況下,我決定用show上的資源的任何可能的衝突的方式。

+0

在第一個URL中,以subject爲例,它是否會顯示ID?我可以以某種方式顯示subject.permalink嗎?當然,我有這個屬性集。 – Alex

+0

是的,如果你使用上面的show_lesson命名路由,你會在params集合中得到:subject,:module和:lesson,然後你可以使用它們來查找永久鏈接而不是id。 –

+0

對於資源而不是命名的路由,它們將正常使用:id,但是您可以覆蓋對象的行爲。通過覆蓋to_param來確定id。這裏有一篇關於重寫to_param的文章,如果你感興趣的話:http://jroller.com/obie/entry/seo_optimization_of_urls_in –

0

我認爲你應該使用路由namespacesfriendly_id寶石,在這種情況下,指定自定義路徑。像水木清華以下應該有所幫助:

namespace :learn do 
    resources :subjects, path: '' do 
    resources :modules, path: '' do 
     resources :lessons 
    end 
    end 
end 

更多有關安裝friendly_id請閱讀rails quick-start。您應該添加slug列,並在你的類(SubjectModuleLesson)延長friendly_id模塊。另請參閱railscast