Что нужно изменить при использовании слага имени пользователя/короткого URL-адреса в рельсах

Я новичок в рельсах, так что простите меня, если я упускаю из виду простые вещи или путь рельсов. Моя цель - полностью заменить URL-адреса формы

/users/1

с участием

/username

для всех целей. (Я думаю, что выставлять на всеобщее обозрение леса ID — это все равно, что ходить с костью, торчащей из руки.) Но реализация кажется немного сложнее, чем я ожидал. Кажется, это меняет весь способ, которым rails индексирует и ищет пользователей, а не просто заменяет метод поиска.

Хотя я как бы заставил это работать, используя переопределение to_param в моем файле user.rb, я читал, что это означает, что у меня будет индексация проблемы вниз при использовании params([:username]), и я не уверен, как это повлияет на мою

(a) модель сеанса при создании нового пользователя и

(b) Использование @User в файле user/show.html.erb.

Итак, я либо просмотрел следующие страницы (или задал вопросы):

Основные вопросы, которые я хотел бы понять из этого вопроса:

  1. Какую функциональность я потеряю при переходе на это? То есть, какие вещи в настоящее время «просто работают» в рельсах, которые мне придется решить и переписать, если я буду добиваться этой замены?
  2. Как показывает практика, лучше ли заменить это на friendly_id? Меня беспокоит то, что создание столбца slug в моей БД, идентичного имени пользователя, кажется немного несухим и вызывает у меня дискомфорт, и я бы предпочел по возможности избегать зависимостей от внешних драгоценных камней.
  3. Как должны выглядеть мои пользователи#show?

person Mittenchops    schedule 18.07.2012    source источник


Ответы (3)


Вы должны проверить Дружественный ID. Делает то, что вы пытаетесь сделать, невероятно легко.

https://github.com/norman/friendly_id

Для этого тоже есть Railscast.

http://railscasts.com/episodes/314-pretty-urls-with-friendlyid?view=asciicast

person Stephen Corwin    schedule 10.08.2012

Если ваше имя пользователя содержит специальные символы, такие как @, -, ., и появилось сообщение об ошибке "Нет совпадений маршрута", вам необходимо отфильтровать его маршрут. Увидеть ниже:

match "/user/:username" => 'users#show', :as => :profile, :username => /[\.a-zA-Z0-9_@-]+/
person Arman Ortega    schedule 30.05.2013

После работы над этим в течение пары недель я бы сказал, что лучший ответ на 2 августа 2012 года заключается в том, что если вы сделаете это, вы нарушите многие соглашения рельсов и разорвете саму ткань времени и пространства.

Уродливые леса в URL-адресах — необходимая часть подхода Rails к RESTfulness.

person Mittenchops    schedule 02.08.2012