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