42 votes

Modification du paramètre id dans le routage Rails

En utilisant le nouveau système de routage de Ruby on Rails 3, est-il possible de changer le paramètre par défaut: 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?

65voto

Ujjwal Thaakar Points 261

Dans votre itinéraire, vous pouvez utiliser

 resources :user, param: :username
 

35voto

j.. Points 5862

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 la méthode to_param dans votre modèle. Vous pouvez obtenir plus d'informations ici .

28voto

Matt Points 9560

Pour Ruby on Rails 4.1.4 (et versions antérieures), vous devez faire ce que les deux j.. et Ujjwal suggéré:

1) En config/routes.rb, ajouter:

resources :user, param: :username

2) En app/models/user.rb, ajouter:

def to_param
  username
end

En vous seulement n ° 1, puis toutes les routes sont correctes, comme peut être vu à partir de 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'aide que de construire une url basée sur un User instance comprennent toujours l' id dans l'url, par exemple, /user/1. Pour obtenir l' username dans la construction des url, vous devez substituer to_param comme en #2.

2voto

Trav McKinney Points 630

Le joyau FriendlyId peut vous aider avec cela. Ryan Bates a un bon tutoriel vidéo sur l'utilisation de ce joyau.

1voto

KULKING Points 600

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X