私の Rails 3 アプリには、ID とユーザー名を持つ User というモデルがあり、どちらもインデックス化されており、一意です。いくつかのビューのどこかに、次のようなものがあります。
<%= link_to 'Show this user', user %>
これにより、次のようなリンクが作成されます。
<a href="/users/980190962">Show this user</a>
その恐ろしい数字は id (主キー) です。ここで、サイトの SEFness のために、link_to "...", user を使用する場合は常に ID の代わりにユーザー名を使用したいと思いますが、その User モデルに対してのみです。link_to にパラメーターを追加しても役に立ちません。これは、既に多くの場所にあるためです (常に別のパラメーターを追加する必要はありません)。
1 つのモデルに対してのみ link_to ヘルパーの動作をオーバーライドするにはどうすればよいですか?
受け入れられた回答から差し引いた、この質問に対する完全な回答を次に示します。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
これにより、link_to で生成されたすべてのリンクがユーザー名を使用するようになり、検索では ID とユーザー名の両方が試行されるため、下位互換性も確保されます。
私と同じように Rails に慣れていない人は、これが役立つと思うでしょう。