Изменение параметра id в маршрутизации Rails - PullRequest
40 голосов
/ 14 мая 2010

Используя новую систему маршрутизации Ruby on Rails 3, можно изменить значение по умолчанию: параметр id

resources :users, :key => :username

выйти со следующими маршрутами

/users/new
/users/:username
/users/:username/edit
...etc

Я спрашиваю, потому что, хотя приведенный выше пример прост, было бы действительно полезно сделать в текущем проекте, над которым я работаю.

Можно ли изменить этот параметр, и если нет, то есть ли конкретная причина, почему бы и нет?

Ответы [ 6 ]

64 голосов
/ 25 декабря 2013

В вашем маршруте вы можете использовать

resources :user, param: :username
35 голосов
/ 15 мая 2010

Если я вас правильно понимаю, вам нужно, чтобы в вашем URL был username вместо id, верно?

Вы можете сделать это, переопределив метод to_param в вашей модели. Вы можете получить больше информации здесь .

26 голосов
/ 30 июля 2014

Для Ruby on Rails 4.1.4 (и, возможно, более ранних версий) вам нужно сделать то, что оба j .. и Ujjwal предлагают:

1) В config/routes.rb добавить:

resources :user, param: :username

2) В app/models/user.rb добавить:

def to_param
  username
end

Если вы выполняете только # 1, все ваши маршруты будут правильными, как видно из rake routes:

$ rake routes
    Prefix Verb   URI Pattern                    Controller#Action
user_index GET    /user(.:format)                user#index
           POST   /user(.:format)                user#create
  new_user GET    /user/new(.:format)            user#new
 edit_user GET    /user/:username/edit(.:format) user#edit
      user GET    /user/:username(.:format)      user#show
           PATCH  /user/:username(.:format)      user#update
           PUT    /user/:username(.:format)      user#update
           DELETE /user/:username(.:format)      user#destroy

Однако вспомогательные методы, которые создают URL на основе экземпляра User, будут по-прежнему включать id в URL, например, /user/1. Чтобы получить username в построенных URL, вам нужно переопределить to_param, как в # 2.

1 голос
/ 25 июля 2013

Драгоценный камень FriendlyId может помочь вам в этом. У Райана Бейтса есть хорошее видеоурок по использованию этого драгоценного камня.

1 голос
/ 01 апреля 2013

Несмотря на то, что ответ был принят спрашивающим, но для этого существует простой подход. Запишите этот код в свой контроллер.

authorize_resource :find_by => :username

и, по вашему мнению, где вы хотите показать ссылку, напишите этот код.

<%= link_to "Username", user_path(u.username) %>

Вам не нужны никакие другие изменения в ваших маршрутах или контроллере.

ОБНОВЛЕНИЕ: Это будет работать, только если вы используете камень CanCan.

0 голосов
/ 15 мая 2010

Передать имя пользователя в качестве входных данных для помощников пути.

На ваш взгляд код:

user_path(u.username) #/users/john

В вашем контроллере обработайте id, полученный как username:

def show
  user = User.find_by_username!(params[:id])
  ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...