Rails и SEF URL: изменение ключа, используемого в link_to, для использования другого поля, чем первичный ключ
В моем приложении на Rails 3 у меня есть модель под названием User с идентификатором и именем пользователя, оба индексируются и уникальны. Где-то в некоторых представлениях у меня есть следующее:
<%= link_to 'Show this user', user %>
Это создает ссылку, как это:
<a href="/users/980190962">Show this user</a>
где это ужасное число - идентификатор (первичный ключ). Теперь, для SEFness сайта, я хотел бы использовать имя пользователя вместо идентификатора везде, где я использую link_to "...", пользователя, но только для этой модели пользователя. Добавление параметров в link_to не помогает, потому что он у меня уже есть во многих местах (и я не хочу постоянно добавлять другой параметр везде).
Как я могу переопределить поведение помощника 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, будут использовать имя пользователя, тогда как find попытается использовать и идентификатор, и имя пользователя, что сделает его также обратно совместимым.
Мысль, что кто-то новичок в Rails найдет это полезным.
1 ответ
Не уверен, что я говорю, но перевес #to_param
в вашей модели может быть то, что вы ищете.