Ответ 1
Если вы правильно поняли, что хотите, вместо id
введите username
в свой URL-адрес?
Вы можете сделать это, переопределив метод to_param
в своей модели. Вы можете получить дополнительную информацию здесь.
Используя новую систему маршрутизации Ruby on Rails 3, можно ли изменить параметр по умолчанию: id
resources :users, :key => :username
выходят со следующими маршрутами
/users/new
/users/:username
/users/:username/edit
...etc
Я спрашиваю, потому что, хотя приведенный выше пример прост, было бы очень полезно сделать в текущем проекте, над которым я работаю.
Можно ли изменить этот параметр, а если нет, есть ли какая-то конкретная причина, почему?
Если вы правильно поняли, что хотите, вместо id
введите username
в свой URL-адрес?
Вы можете сделать это, переопределив метод to_param
в своей модели. Вы можете получить дополнительную информацию здесь.
В вашем маршруте вы можете использовать
resources :user, param: :username
Для 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.
Хотя ответ был принят апеллятором, но для этого есть простой подход. Напишите этот код в контроллере.
authorize_resource :find_by => :username
и в вашем представлении, где вы хотите показать ссылку, напишите этот код.
<%= link_to "Username", user_path(u.username) %>
Вам не нужны никакие другие изменения в ваших маршрутах или контроллере.
ОБНОВЛЕНИЕ: Это будет работать, только если вы используете камень CanCan.
FriendlyId gem поможет вам справиться с этим. Ryan Bates имеет хороший видеоурок об использовании этого драгоценного камня.
Передайте имя пользователя в качестве входных данных для помощников путей.
В вашем коде зрения:
user_path(u.username) #/users/john
В контроллере обработайте id
, полученный как username
:
def show
user = User.find_by_username!(params[:id])
...
end