Rails 3: Постоянная ссылка публичный профиль - PullRequest
2 голосов
/ 30 декабря 2010

У меня есть /users/1 в качестве общедоступного профиля пользователя (метод show), но я хотел бы иметь /user_name вместо /users/1.

Могу ли я сделать это, если использую devise?

Спасибо

Edit: Мой шоу-контроллер:

# public profile page
  def show
    @user = User.find(params[:id])
  end

Ответы [ 3 ]

8 голосов
/ 30 декабря 2010

Получить имя пользователя в URL

Ты можешь сделать это. Devise - это просто решение для аутентификации. Другие ваши контроллеры могут вести себя так, как вы хотите. Вот краткий обзор шагов, которые необходимо выполнить, чтобы получить это поведение URL.

  • Убедитесь, что user_name уникален для каждого пользователя
  • Переопределить пользовательский to_param метод для возврата user_name
  • Изменить способ, которым вы получаете пользователя из базы данных

Это будет идти в вашей модели пользователя

class User < ActiveRecord::Base
  devise :database_authenticatable, :confirmable, :validatable
  validates_uniqueness_of :user_name

  def to_param
    user_name
  end

end

Затем, в вашем контроллере, сделайте что-то вроде этого:

@user = User.find_by_user_name(params[:id])

Такие помощники, как user_path(@user), используют метод to_param для генерации URL.

Удалить контроллер из URL

Что касается изменения маршрута с /user/:id на /:id. Примерно так будет работать:

match '/:id' => 'users#show', :as => :user

Здесь вы можете использовать user_path и user_url из-за :as => :user

Но вы можете извлечь пользу из чтения:

Как я могу реализовать тщеславные URL в приложении Rails?

Как реализовать "короткие" вложенные тщеславные URL в рельсах?

Есть много вещей, о которых стоит подумать, когда вы делаете это таким образом.

0 голосов
/ 02 марта 2011

Ответ Донтанга в основном правильный, но есть некоторые очень важные вещи, в которых его ответ отсутствует.

Во-первых, вам абсолютно не следует использовать прямые имена пользователей для слагов. Вам необходимо каким-то образом нормализовать их и внести в черный список определенные слагы, чтобы они не сталкивались с именами вашего ресурса или действия, что особенно важно, когда вы используете их без префикса ресурса в URL. Итак, как указал ти, первым шагом является использование библиотеки генерации слагов, и friendly_id в настоящее время лучший. Во-вторых, вам нужно добавить имена ресурсов в черный список slug friendly_id и обработать исключение, выдаваемое при создании пули-нарушителя. Как правило, вы хотите иметь атрибут cached_slug в медленной модели, и вам нужно будет указать это в #to_param (например, def to_param; cached_slug end). Затем вам нужно обновить ваши искатели, чтобы проверить слаг, например ModelName.where(:cached_slug => params[:id]).first

Редактировать: также, ЗАПИШИТЕ комментарий к другому ответу, в котором рекомендуется использовать User.all, помните, что .all никогда не следует использовать ни в одной таблице, в которой имеется несколько записей. Вы загружаете всю таблицу в память как объекты Ruby и можете легко перевести свой сервер в тупик.

0 голосов
/ 30 декабря 2010

Если вы хотите найти по имени пользователя или идентификатору что-то вроде этого должно работать:

@user = User.find_by_username(params[:id]) || User.find_by_id(params[:id])
...