0

使用 Rails 3.1.1 和 gemacts_as_tree。我已经用谷歌搜索了这个问题并在 SO 上检查了类似的问题(答案太旧或不相关)。

我有一个名为 article 的模型,其路线今天看起来像:

  resources :articles, :path => '', :only => :show 
  resources :articles, :path => 'articles', :except => :show

我有三篇文章:“书”、“第 1 章”和“第 2 章”。book 是第 1 章和第 2 章的父级。

今天,我每篇文章的路径是:host.com/book、host.com/chapter1 和 host.com/chapter2。我希望 url 路径是 host.com/book/chapter1 和 host.com/book/chapter2 ,即嵌套路由。

如何以干净简单的方式创建它?

基本上,我想要一个路径,它将是 host.com/:parent_id/:parent_id/:id 和 N 个 :parent_id。几乎是如何路由 Wordpress 文章的。

我不相信路由 globber 是解决方案,但我可能错了。host.com/:id 和 host.com/foo/bar/:id 似乎给出了相同的结果,这将导致重复的内容。

4

4 回答 4

1

一个)

如果您有路由解决方案并且唯一的问题是您担心重复的内容问题,您可以考虑添加<link rel="canonical" href="...">到从这些请求生成的页面中。不过,它并不是万无一失的,因为谷歌认为这是一个建议。

不确定路由 globbers 解决方案是否会负责生成具有父 ID 的 URL。

二)

您不需要父 ID 来执行路由,对吗?您只想将它​​们包含在 URL 中并像使用 URL 一样路由这些请求,对example.com/chapter1吗?

如果您考虑的解​​决方案不是纯粹在 Rails 级别,那么重写这些请求的 URL 以使其在 Rails 处理之前/:parent_id/:parent_id/:id成为可能呢?/:id如果有一个静态前缀,那会更容易,比如/articles/:parent_id/:parent_id/:id.

我想您需要编写一些帮助程序来生成带有父 ID 的 URL,以链接到这些资源。

重复内容

无论哪种方式,您都需要生成包含父 ID 的 URL,因此如果您仅使用这些 URL 链接到这些资源,则可能不太可能出现重复内容问题。

于 2012-04-17T12:47:15.903 回答
1

您有三个“文章”...“书”、“章节 1”和“章节 2”都代表相同的“资源”,名为“文章”。不能嵌套相同的“资源”。如果您需要嵌套路由,则必须分别定义父资源和子资源。以下代码spinet可能会对您有所帮助

class Book < ActiveRecord::Base
  has_many :chapter
  accepts_nested_attributes_for :chapters
end    

class Chapter < ActiveRecord::Base
  belongs_to :book
  acts_as_tree :parent_id
end
于 2012-04-13T11:09:37.667 回答
0
match '*p1/*p2/*p3/.../*pn' => 'articles#show'

... 不是文字,只需定义最多 n 个所需的参数。

URL:
host.com/book/chapter1
params[:p1] = 'book'
params[:p2] = 'chapter1'
params[:p3] = nil


URL:
host.com/book/chapter1/section2/sentence4
params[:p1] = 'book'
params[:p2] = 'chapter1'
params[:p3] = 'section2'
params[:p4] = 'sentence4'
params[:p5] = nil

那必须是您的最后一条路线。

我认为这也会使任何包罗万象的路由无法运行,但它们现在在 Rails 3 的默认 routes.rb 中被注释掉,如果你使用它们,你必须手动指定通常由旧式包罗万象路由处理的所有路由.

而且,如果您有一个名为articles 的控制器,那么您永远不可能拥有与所有控制器相同的标题为“articles”的书,为了安全起见,您可能必须重命名所有控制器,即articles 变为X_articles。那时你永远不可能有一本名为 X_articles 的书,等等……

完全未经测试。

于 2012-04-15T18:56:19.330 回答
0

你想要做的是将 Rails 用于它不适合的东西。无论您在这里得到什么答案,它要么不是 RESTful、DRY,要么与 Active Record 一起使用没有意义。考虑重新构建您的想法,或者将您的应用程序带到另一个平台,如果还不算太晚的话。

于 2012-04-15T19:13:08.583 回答