2011-12-02 4 views
1

私は個々のアイテムを管理するためのRailsアプリケーションを作成しています。各アイテムにはアイテム番号(ゼロ詰め、4桁の数字、たとえば0002または0212または1002)があります。これはアプリケーションのURLで使用します。現在/items/2に移動している場合は、id = 2の項目を取得し、item_number = 2の項目は取得しません。私のroutes.rbファイルにはresources :itemsしか含まれていません。私はアイテム番号でアイテムを引き出すことができるようにどのように行くのですか?カスタムID(IDではない)を持つURL URL

答えて

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メソッドを変更する必要はありません。

+0

あなたは私が言おうとしていたものそのまま書いたあなたのケースでは、あなたはこのような何かを行うことができます。良い答え:) – Andrew

+0

私も仲間 – phoet

+0

おかげでロビンのように、クラスメソッドと呼ばれる 'find_by_param'を作成することをお勧めします、私はちょうど数を返すようにto_paramを加え、@item = Item.find_by_number(のparams私のアイテムコントローラを更新しました[:id])、私は/ items/1023 – Jack

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"