Подтвердить что ты не робот

Изменение параметра id в маршрутизации Rails

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

resources :users, :key => :username

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

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

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

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

4b9b3361

Ответ 1

Если вы правильно поняли, что хотите, вместо id введите username в свой URL-адрес?

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

Ответ 2

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

resources :user, param: :username

Ответ 3

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

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.

Ответ 4

Хотя ответ был принят апеллятором, но для этого есть простой подход. Напишите этот код в контроллере.

authorize_resource :find_by => :username

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

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

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

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

Ответ 5

FriendlyId gem поможет вам справиться с этим. Ryan Bates имеет хороший видеоурок об использовании этого драгоценного камня.

Ответ 6

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

В вашем коде зрения:

user_path(u.username) #/users/john

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

def show
  user = User.find_by_username!(params[:id])
  ...
end