私は個々のアイテムを管理するためのRailsアプリケーションを作成しています。各アイテムにはアイテム番号(ゼロ詰め、4桁の数字、たとえば0002
または0212
または1002
)があります。これはアプリケーションのURLで使用します。現在/items/2
に移動している場合は、id = 2
の項目を取得し、item_number = 2
の項目は取得しません。私のroutes.rbファイルにはresources :items
しか含まれていません。私はアイテム番号でアイテムを引き出すことができるようにどのように行くのですか?カスタムID(IDではない)を持つURL URL
1
A
答えて
7
は、あなたのアイテムのモデルで
to_param
メソッドをオーバーライド
:あなたはあなたのルートには何も変更する必要はありません
def to_param
item_number.to_s
end
。あなたは、URLでアイテムの名前を表示したい場合、あなたは次のことを行うことができます:あなたはちょうどだけ知っているのでfind_by_item_number(params[:id])
を使用してアイテムを見つける必要があります
def to_param
"#{id}-#{name}".parameterize
end
を
これは素晴らしいことですが、 "1-item-name" .to_iは1
です!だからどこでもあなたのfindメソッドを変更する必要はありません。
2
通常、item_path
ヘルパー(あなたがresources :items
を定義することにより、無料で取得すること)のURLを構築するために、アイテムのIDを使用しています。
item = Item.find(1)
item_path(item) # => "/items/1", i.e. the same result as calling item_path(item.id)
それは項目に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) # => "https://stackoverflow.com/users/0001"
関連する問題
あなたは私が言おうとしていたものそのまま書いたあなたのケースでは、あなたはこのような何かを行うことができます。良い答え:) – Andrew
私も仲間 – phoet
おかげでロビンのように、クラスメソッドと呼ばれる 'find_by_param'を作成することをお勧めします、私はちょうど数を返すようにto_paramを加え、@item = Item.find_by_number(のparams私のアイテムコントローラを更新しました[:id])、私は/ items/1023 – Jack