Rails动态重命名url中的模型名称

时间:2013-08-02 02:36:53

标签: ruby-on-rails

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

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

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

e.g。如果该项目属于名称为"类别"的类别,那么,我希望将该网址视为/ footwear /:id。如果有另一个项目属于名称为"服装"的类别,那么我希望将URL视为/ clothing /:id

这可能吗?

1 个答案:

答案 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前缀,并在底部使用基于类别的路由作为一个包罗万象。

希望这有帮助。