在我的 Rails 3 应用程序中,我有一个名为 User 的模型,它具有 id 和 username,两者都是索引且唯一的。在某些观点中,我有以下几点:
<%= link_to 'Show this user', user %>
这会创建一个这样的链接:
<a href="/users/980190962">Show this user</a>
那个可怕的数字是 id(主键)。现在,为了站点的 SEFness,我想在我使用 link_to "...", user 的任何地方使用用户名而不是 id,但仅适用于该用户模型。向 link_to 添加参数并没有帮助,因为我已经在很多地方拥有它(而且我不想一直在任何地方添加另一个参数)。
如何仅针对一个模型覆盖 link_to 助手的行为?
这是我从接受的答案中扣除的这个问题的完整答案。我在我的用户模型中添加了以下内容:
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 生成的所有链接都使用用户名,而 find 将同时尝试 id 和用户名,使其也向后兼容。
以为像我这样刚接触 Rails 的人会发现这很有用。