0

我被困在一个涉及 Rails 3 路线的非常棘手的问题上,而且路线不够好,无法自己解决这个问题。我有一个只有“显示”和“索引”操作的“评论”资源。我将 Friendly ID gem 用于 slugged ID,而且我还有一个嵌套的评论资源,它允许人们对评论发表评论。

resources :reviews, :only => [:index, :show] do
  resources :comments, :only => [:new, :create]
end 

因此,到目前为止,我的索引页面路径只是“评论”,以及类似“评论/矩阵”的显示操作。到目前为止很简单。

现在首先,我在主索引页面上遇到了一些问题。我在索引页面上有 will_paginate gem,我正在缓存页面。问题是,当路径类似于 /reviews?page=2 时,缓存不起作用,而是在进行分页时我需要路径为 /reviews/2/,所以我在下面的前面添加了前面的评论资源使这项工作。

match 'reviews(/:page)' => 'reviews#index', :constraints => { :page => /[0-9]/ }

为什么要约束?因为我的“显示”资源路线不起作用,因为上面的行 - 没有数量限制 - 最终成为干扰“显示”路线的“包罗万象”。由于 show 动作的 ID 总是单词,而索引上的分页页面总是有一个数字,这就是我这样做的原因。

但事情是这样的,我不希望“显示”路线只是“评论/矩阵”。看,所有评论都按被评论的事物类型分类,所以我真的希望“显示”路径类似于“评论/电影/矩阵”或“评论/书籍/指环王” 。

我宁愿将原始评论“显示”路径用于其他类别索引页面,例如“评论/书籍”。(上述约束的另一个原因。)但我将把它留给另一个 SO 问题,因为我不想让这个问题太复杂。

所以回到上一个问题。通常我想上面的问题可以通过一个简单的“匹配”路由(使用路由通配符?)来解决,除了我们在评论资源中有那些嵌套的评论。我该如何制作像上面这样的“显示”页面,同时保留评论上的评论嵌套资源?

4

1 回答 1

0

没有汗水(如果这是你的意思)。

match 'reviews(/:page)' => 'reviews#index', :constraints => {:page => /[0-9]+/}
match 'reviews/comments/:id' => 'comments#my_action', :constraints => {:id => /[0-9]+/}
match 'reviews/:path' => 'reviews#show', :constraints => {:path => /.+/}
  • 将约束添加到第三条指令将允许您/:path. (这是真的:完全不使用约束将不允许foo/bar匹配此模式。)(替代正则表达式/.+/,您可能希望/[a-zA-Z/]+/,但这并不重要,因为早期的路径已经捕获了不应该是的所有内容#show。)
  • 订单很重要。按照它们出现的顺序保留这三个。
于 2012-06-04T19:57:52.730 回答