2012-01-13 3 views
0

В моем приложении Rails 3 у меня есть модель под названием User с идентификатором и именем пользователя, которые индексируются и уникальны. Где-то в некоторых представлениях я следующее:URL-адреса Rails и SEF: изменение ключа, используемого в link_to, для использования другого поля, а затем первичного ключа

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

Это создает ссылку, как это:

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

где этот ужасный номер является идентификатором (первичный ключ). Теперь, для SEFness сайта, я хотел бы использовать имя пользователя вместо id везде, где я использую link_to «...», пользователя, но только для этой модели пользователя. Добавление параметров в 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 использовать имя пользователя, в то время как находка будет пытаться как идентификатор и имя пользователя, что делает его обратно совместимым.

Думал, что кто-то такой же новый, как я, в Rails, найдет это полезным.

ответ

2

Не уверен, что я говорю, но переопределение #to_param в вашей модели может быть тем, что вы ищете.

+0

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

+1

@Katen: вы, кажется, знаете, о чем говорите. Просто для завершения вашего ответа: мне нужно было сделать «def to_param // имя пользователя // конец модели, но затем также в контроллере заменить все« User.find »на« User.find_by_id (params [: id]) », , Теперь мне нужно было, чтобы, конечно, найти метод поиска модели. – zmilojko