En utilisant Ruby on Rails 3 le nouveau système de routage, est-il possible de changer le paramètre default: id
resources :users, :key => :username
sortir avec les itinéraires suivants
/users/new
/users/:username
/users/:username/edit
...etc
Je demande parce que bien que l'exemple ci-dessus soit simple, il serait vraiment utile de le faire dans un projet en cours sur lequel je travaille.
Est-il possible de modifier ce paramètre, et sinon, y a-t-il une raison particulière pour laquelle non?
Si je vous comprends bien, ce que vous voulez, c'est d'avoir le username
au lieu de id
dans votre URL, non?
Vous pouvez le faire en remplaçant le to_param
méthode dans votre modèle. Vous pouvez obtenir plus d'informations ici .
Dans votre itinéraire, vous pouvez utiliser
resources :user, param: :username
Pour Ruby on Rails 4.1.4 (et éventuellement les versions antérieures), vous devez faire ce que les deux j .. et jjwal suggéré:
1) Dans config/routes.rb
, ajouter:
resources :user, param: :username
2) Dans app/models/user.rb
, ajouter:
def to_param
username
end
Si vous ne faites que # 1, tous vos itinéraires seront corrects, comme le montre 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
Cependant, les méthodes d'assistance qui construisent une URL basée sur une instance User
incluront toujours le id
dans l'url, par exemple /user/1
. Pour obtenir le username
dans les URL construites, vous devez remplacer to_param
comme au # 2.
La gemme FriendlyId peut vous aider. Ryan Bates a une bonne tutoriel vidéo sur l'utilisation de ce joyau.
Bien que la réponse ait été acceptée par le demandeur, il existe une approche simple pour ce faire. Écrivez ce code dans votre contrôleur.
authorize_resource :find_by => :username
et à votre avis, où vous souhaitez afficher le lien, écrivez ce code.
<%= link_to "Username", user_path(u.username) %>
Vous n'avez pas besoin d'autres changements dans vos itinéraires ou votre contrôleur.
MISE À JOUR: Cela ne fonctionnera que si vous utilisez la gemme CanCan.
Passez le nom d'utilisateur comme entrée aux assistants de chemin.
Dans votre code d'affichage:
user_path(u.username) #/users/john
Dans votre contrôleur, traitez le id
reçu comme username
:
def show
user = User.find_by_username!(params[:id])
...
end