实现友好的URL和多个嵌套资源

时间:2013-01-17 04:23:25

标签: ruby-on-rails

在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

这就是我所知道的一切。我有点卡住了。有人可以帮我解决路由问题吗?

2 个答案:

答案 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)

我认为您应该使用路由namespacesfriendly_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模块(SubjectModuleLesson)。另见railscast