在Rails中,我有一个名为item的模型。每个项目属于一个类别(另一个模型),它有一个名为name的属性。
在寻找任何项目时,我将网址视为/ item /:id
相反,我希望该网址显示为/' item.category.name' /:id
e.g。如果该项目属于名称为"类别"的类别,那么,我希望将该网址视为/ footwear /:id。如果有另一个项目属于名称为"服装"的类别,那么我希望将URL视为/ clothing /:id
这可能吗?
答案 0 :(得分:2)
如果您设置了
之类的路线# 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高级路由约束来进一步缩小“哪些值将被视为有效的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是一个可以在应用程序初始化期间设置的有限列表时,这才真正有效。
更好,更具可扩展性的方法可能是设计您的网址,如
/brand/adidas
/brand/teva
/shoes/1
/shoes/2
/jackets/45
IOW,为brand
这样的已知名称空间加上适当的人性化URL前缀,并在底部使用基于类别的路由作为一个包罗万象。
希望这有帮助。