如何在Rails中进行分层永久链接/路由?

时间:2012-10-03 01:30:22

标签: ruby-on-rails ruby url-routing ruby-on-rails-3.2

我正在尝试使用“友好”永久链接结构在我的Rails 3.2应用程序中路由内容(如Adam Darowski的博客文章1中所述)。我找到了一些描述如何在单个“页面”或“类别”控制器中执行此操作的答案,但理想情况下,我希望应用程序在“部分”URL的情况下路由到最具体的控制器。

http://example.com / shows / :genre / :series / :season / :episode

因此,例如:/shows/entertainment/the-survivors/01/01将路由到Episodes控制器(播放特定系列的第1季第1集),/shows/entertainment/the-survivors/将路由到系列控制器(列出该剧中的所有剧集)系列)。等等。

我听说过嵌套路由应该不超过一级的规则,这似乎是一个糟糕的解决方案(标准嵌套路由“污染”带有控制器名称和ID的URL,如/genres/entertainment/shows/the-survivors/seasons/1/episodes/1 ,我想避免)。

到目前为止,我能够弄清楚的最佳解决方案只是我的routes.rb文件中的一系列越来越具体的match规则,这些规则指向每个控制器,因为URL越来越具体。< / p>

在Rails中有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我建议使用像friendly_id这样友好的网址宝石。除非专门为路由添加内容,否则我将删除您网址的“显示”部分。然后你可以制作像:

这样的网址
/entertainment/the-survivors/s01e01

然后通过slug找到每个系列和剧集(分别是'the-survivors'和's01e01')。

我认为无论哪种方式,您都必须在路线文件中创建自定义路线,就像您在问题中提到的那样,但是我没有看到问题。

但我不同意你创建两个控制器的想法。在你的问题中你提到它

  

将路由到系列控制器(列出该系列中的所有剧集)

用您的语言说“列出所有剧集”。剧集是资源,所以如果你真的是RESTful,那么“系列”页面就应该是index的{​​{1}}动作,每集都是{{1} } EpisodesController的行动。