Rails路由:相同的控制器路由不同

时间:2013-08-28 11:55:42

标签: ruby-on-rails dynamic tags routes

在我们的应用中,我们有tag模型,例如red yellow big small等多个类别,例如colorsize(标记模型确实有一个字段category)。现在,而不是

/tags/big
/tags/small
/tags/red
/tags/yellow
/tags

我们想要像

这样的路线
/size/big
/size/small
/color/red
/color/yellow
/size
/color
...

此外,网址助手也应该工作,即tag_path应该产生正确的网址 如何在routes.rb文件中执行此操作?谢谢!

修改

  1. 需要让索引页/ url_helper工作
  2. will_paginate使用tag_path生成包含页码的链接。需要重载tag_path?

1 个答案:

答案 0 :(得分:0)

您可以使用带约束的路线。定义一个与自定义条件执行匹配的类。您可以使用match搜索API以查看详细信息。

我假设你的标签有两列名为“category”和“name”。

route.rb

match ':category/:name' => 'tags#show', via: 'get', constraints: TagRouteWhiteList.new, as: 'tag'

应用程序/模型/ tag_route_white_list.rb

class TagRouteWhiteList
  def matches(request)
    Tag.distinct('category').include?(request.params[:category]) && Tag.distinct('name').include?(request.params[:name])
  end
end

在您看来,您可以使用tag_path(category: @tag.category, name: @tag.name)