2

在 Rails 中,我有一个名为 item 的模型。每个项目都属于_to 类别(另一个模型),它有一个名为name 的属性。

在寻找任何项目时,我将 url 视为 /item/:id

相反,我希望 url 显示为 /'item.category.name'/:id

例如,如果该项目属于名称为“鞋类”的类别,那么我希望将 url 视为 /footwear/:id。如果有另一个属于名称为“服装”的类别的项目,那么我希望将 URL 视为 /clothing/:id

这可能吗?

4

1 回答 1

2

如果您设置类似的路线

# config/routes.rb
RouteTest::Application.routes.draw do
  get ':category_name(/:id)', to: 'items#show', constraints: {id: /\d+/}
end

它将映射到您的 ItemsController 中的显示操作,并且在那里,您将可以访问 params[:category_name] 和 params[:id]。有了这些信息,您应该能够获取所需的数据并进行渲染。

但是请注意,此路由可能会产生屏蔽任何后续路由的不良影响。您可以使用 rails 高级路由约束来进一步缩小“哪些值将被视为有效的 category_names”,但这不是一个非常可扩展或可管理的方法。

例如,您可以执行类似的操作

RouteTest::Application.routes.draw do
  get ':brand_name(/:id)', to: 'items#show', constraints: lambda { |request| BrandList.include?(request.params[:brand_name]) }

  # etc. ...

  get ':category_name(/:id)', to: 'items#show'
end

但这只有在 BrandList 是一个可以在应用程序初始化期间设置的有限列表时才真正有效。

一种更好、更具可扩展性的方法可能是设计您的 URL,例如

/brand/adidas
/brand/teva
/shoes/1
/shoes/2
/jackets/45

IOW,brand使用适当的人类友好 URL 前缀为已知名称空间添加前缀,并使用基于类别的路由作为底部的全部内容。

希望这可以帮助。

于 2013-08-02T03:45:39.190 回答