在Rails 3中,我希望创建一个如下所示的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 :(得分:0)
我的方式,而不是嵌套资源,在这种情况下我不认为是必要的是为每个主题,模块和课程创建自定义节目路线。
所以我按如下方式设置每个资源:
resources :subjects, :except => [:show]
resources :modules, :except => [:show]
resources :lessons, :except => [:show]
然后明确地匹配show routes:
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'
这将为您提供更多粒度来定义show的路由(这是您要自定义URL的常规操作)。
现在,根据您的要求,您可能仍希望嵌套资源,但希望能为您提供一些想法。
顺便说一下,我用show_命名我的show_xxx路由只是为了澄清它们是命名路由,并且为了避免任何可能的冲突,以防我决定在资源上使用show。
答案 1 :(得分:0)
我认为您应该使用路由namespaces和friendly_id gem来指定自定义路径。 Smth喜欢以下应该有所帮助:
namespace :learn do
resources :subjects, path: '' do
resources :modules, path: '' do
resources :lessons
end
end
end
有关安装friendly_id
的详情,请参阅rails quick-start。您应该在类中添加slug
列并扩展friendly_id
模块(Subject
,Module
,Lesson
)。另见railscast。