0

私の 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 に慣れていない人は、これが役立つと思うでしょう。

4

1 に答える 1

2

私が何を言っているのかわかりませんが#to_param、モデルをオーバーライドすることがあなたが探しているものかもしれません。

于 2012-01-13T15:38:47.990 に答える