Rails灵活的路线

时间:2014-05-27 22:45:54

标签: ruby-on-rails

我正在开展一个核心实体是"建设"的项目。每个建筑都属于一个类别,子类别和城市。我想要做的就是拥有这样的灵活网址:

/nice-building-name (f.e.: "/eiffel-tower")
/category (f.e.: "/big")
/category/subcategory (f.e.: "/big/red")
/category/subcategory/city (f.e.: "/big/red/prague")
/subcategory (f.e.: "/red")
/subcategory/city (f.e.: "/red/prague")
/city (f.e.: "/prague")

问题在于,如果我指定这样的路线:

match ':category_id/buildings',  to: 'buildings#category',  via: 'get'
match ':subcategory_id/buildings',  to: 'buildings#subcategory',  via: 'get'

它始终仅匹配第一个指定的路线,在任何情况下都不能到达第二个路线。我需要的是这样的行为:

我输入的URL如:/ 7 / places。它会检查是否存在ID为7的类别。如果不是,它不会停止,但会检查是否存在ID为7的子类别。如果是,则匹配第二条路径。

我认为现在很清楚。是否可以拥有这样的URL?是否有可能实现这一目标"动态"路由?或者至少类似的东西?

谢谢。

2 个答案:

答案 0 :(得分:1)

我认为这是可能的,看看这个: http://guides.rubyonrails.org/routing.html#dynamic-segments

从以上链接:

3.2动态细分 您可以根据需要在常规路径中设置尽可能多的动态段。除了:controller或:action之外的任何其他内容都可以作为params的一部分。如果您设置此路线:

get ':controller/:action/:id/:user_id'

/ photos / show / 1/2的传入路径将被分派到PhotosController的show动作。 params [:id]将是" 1"和params [:user_id]将是" 2"。

因此,对于您的第一个示例,您可以设置一条路线,例如 得到':controller /:action /:building_name'

然后传入请求到路径/buildings/show/my_building_name

将被路由到楼宇控制器的show动作,而params [:building_name]将可用设置为" my_building_name"

答案 1 :(得分:1)

只要您的关联(belongs_to,has_many,has_one ...)设置正确,您就可以为每个资源开发路线。

#routes.rb
resources: buildings

resources: categories do
  resources: subcategories do
      resources: cities
  end
end