2009-09-04 5 views
0

У меня есть модель пользователя и модель профиля.Дружественный URL-адрес, с помощью Twist

user has_one :profile profile belongs_to :user

Из-за этого отношения, я подтянуть свои профили, вызвав идентификатор пользователя. Поэтому мои URL-адреса выглядят так: website.com/users/[user_id]/profile

Я не уверен, есть ли решение моей проблемы. Вот он: Я хотел бы показывать дружественные URL-адреса. Для этого я использую friendly_id. Но наши профили для предприятий, и это название компании, которое мы хотим ввести в URL. Проблема в том, что наша пользовательская модель намеренно не запрашивает название компании, а именно user_id, которая отображается в текущем URL.

Есть ли способ захватить фирменное имя из модели профиля (т. Е. @ Profile.name) и использовать его для заполнения [user_id] части URL-адреса?

ОБНОВЛЕНИЕ: Я создал драгоценный камень friendly_id, и похоже, что это может сработать. В моей модели профиля, у меня есть это: has_friendly_id :name, :use_slug => true

Когда я обновил профиль, friendly_id сделал slugify URL-адрес, поставив название компании из профиля в user_id части URL. Но, конечно, это исключение.

Так что, если название компании в модели профиля - это панель Mike's, в url теперь говорится/users/mike-s-bar/profile. Исключение говорит, что это: Не удалось найти пользователя с ID=mike-s-bar.

Вот мой профиль контроллера:

def show 
    @user = User.find(:all) 
    @profile = User.find(params[:user_id]) 
end 

Есть ли способ, чтобы сделать эту работу?

ответ

0

Хм, существует ли у бизнеса несколько пользователей? Если да, то каким образом /users/xzy/profile будет уникальным?

В противном случае: я не думаю, что friendly_id может обрабатывать столбцы за пределами таблицы моделей. Однако здесь подход, который я хотел бы попробовать:

class User 

    # used by rails to generate URLs - defaults to ID 
    def to_param 
    "#{self.id}-#{self.business.name}" 
    end 

    ... 
end 

Метод find пропускает все позади тире сама по себе. Это приведет к тому, что ваши URL-адреса будут немного менее читаемыми: /users/xzy/profile станет /users/7-xzy/profile, что очень похоже на то, как SO делает это.

+0

я второй, но хотел бы добавить вызов спараметрировать:

def to_param "#{id}-#{business.name.parameterize}" end
Вы хотите сохранить в URL, так как мы уверены, что это однозначно идентифицирует пользователей. – hgmnz

Смежные вопросы