web-dev-qa-db-fra.com

Modification du paramètre id dans Rails routing

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?

42
joeellis

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 .

35
Ju Nogueira

Dans votre itinéraire, vous pouvez utiliser

resources :user, param: :username
65
Ujjwal Thaakar

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.

28
Matt

La gemme FriendlyId peut vous aider. Ryan Bates a une bonne tutoriel vidéo sur l'utilisation de ce joyau.

2
Trav McKinney

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.

1
KULKING

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
0
Harish Shetty