2012-01-13 3 views
0

私のRails 3アプリケーションでは、IDとユーザー名を持つUserというモデルがあります。どこかのビューで、私は次のようしている。このようなリンクを作成しますRailsとSEF URL:link_toで使用されるキーをプライマリキーと異なるフィールドを使用するように変更する

<%= link_to 'Show this user', user %> 

:その恐ろしい数は、ID(主キー)である

<a href="https://stackoverflow.com/users/980190962">Show this user</a> 

を。さて、サイトのSEFnessについては、私はuser_link_to "..."(user)を使用しているにもかかわらず、idの代わりにusernameを使用したいと思います。 link_toにパラメータを追加することは役に立ちません。なぜなら、私はすでに多くの場所にそれを持っているからです(そして、いつでもどこでも別のパラメータを追加する必要はありません)。

link_toヘルパーの動作を1つのモデルに対してのみ変更するにはどうすればよいですか?


これは、私が受け入れられた答えから差し引いたように、この質問に対する完全な答えです。私は私のUserモデルに次の追加:

def to_param # overridden to use username as id, and not the id. More SEF. 
    username 
end 
def self.find(id) 
    @user = User.find_by_id(id) 
    @user = User.find_by_username(id) if @user == nil 
    throw ActiveRecord.RecordNotFound.new if @user == nil 
    @user 
end 

これは、今すぐ検索は、互換性のある、それはまた、後方作り、IDとユーザー名の両方を尽くすながらのlink_toで生成されたすべてのリンクは、ユーザー名を使用します。

誰かが私にとってRailsに新しいことは、これが便利だと思いました。

答えて

2

あなたのモデルで#to_paramを上書きすることが、あなたが探しているものかもしれません。

+0

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param – glortho

+1

@Katen:あなたが話していることを知っているようです。あなたの答えを完成させるには、私は 'to_param // username/end'をモデルで実行する必要があったが、コントローラ内で 'User.find'を 'User.find_by_id(params [:id])' 。今私はもちろん、モデルのfindメソッドを検証する必要があった... – zmilojko

関連する問題