带有自定义标识符(不是id)的Rails URL

时间:2011-12-02 21:01:09

标签: ruby-on-rails ruby ruby-on-rails-3

我正在创建一个用于管理单个项目的Rails应用程序。每个项目都有一个项目编号(零填充,4位数字,例如000202121002),我想在应用程序的网址中使用。如果我目前导航到/items/2,则会显示包含id = 2的商品,而不是包含item_number = 2的商品。我的routes.rb文件只包含resources :items;我将如何允许按项目编号提取项目?

2 个答案:

答案 0 :(得分:7)

覆盖商品模型中的to_param方法:

def to_param
    item_number.to_s
end

您无需更改路线中的任何内容。 您只需使用find_by_item_number(params[:id])

找到项目

您知道:如果您想在网址中显示该项目的名称,您可以执行以下操作:

def to_param
    "#{id}-#{name}".parameterize
end

有什么好处,就是“1-item-name”.to_i是1!因此,您无需在任何地方更改查找方法。

答案 1 :(得分:2)

通常,item_path助手(通过定义resources :items免费获得)使用项目的ID来构建网址:

item = Item.find(1)
item_path(item) # => "/items/1", i.e. the same result as calling item_path(item.id)

它通过调用Item类的to_param实例方法来实现这个“魔术”,它默认返回项目的id。

因此,如果您需要其他内容,则必须覆盖to_param方法。在你的情况下,你可以做这样的事情:

class Item < ActiveRecord::Base
  def to_param
    item_number
  end
end

然后:

item = Item.find_by_item_id('0001')
item_path(item) # => "/users/0001"