Ruby on rails Rails在url中动态重命名模型名称

Ruby on rails Rails在url中动态重命名模型名称,ruby-on-rails,Ruby On Rails,在Rails中,我有一个名为item的模型。每个项目都属于类别(另一个模型),该类别有一个名为name的属性 在查找任何项目时,我看到url为/item/:id 相反,我希望url显示为/'item.category.name'/:id e、 g.如果项目属于名称为“Shoots”的类别,则我希望将url视为/shoots/:id。如果还有另一个项目属于名称为“clothing”的类别,则我希望将url视为/clothing/:id 这是可能的吗?如果您设置的路线如下 # config/rout

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

在查找任何项目时,我看到url为/item/:id

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

e、 g.如果项目属于名称为“Shoots”的类别,则我希望将url视为/shoots/:id。如果还有另一个项目属于名称为“clothing”的类别,则我希望将url视为/clothing/:id


这是可能的吗?

如果您设置的路线如下

# config/routes.rb
RouteTest::Application.routes.draw do
  get ':category_name(/:id)', to: 'items#show', constraints: {id: /\d+/}
end
它将映射到ItemsController中的show操作,在那里,您可以访问params[:category_name]和params[:id]。有了这些信息,您应该能够获得所需的数据并进行渲染

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

例如,你可以做如下事情

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
请注意,在已知名称空间(如
品牌
)前面加上适当的人性化URL前缀,并在底部使用基于类别的路由作为总括


希望这能有所帮助。

一个问题-如果我有另一条路线添加到该路线-获取:brand_name/:id',to:items#显示如果brand_name和category_name有一个公共值(例如“nike”),哪个参数将传递到items#show、params[:brand_name]或params[:category_name]?看起来它将与首先定义路由的路由匹配。更正我之前的评论-看起来它将始终默认为第一个定义的路由更新,以解决有关此始终匹配并屏蔽后续其他路由的问题。