Question

J'aime toutes les routes par défaut générées par le map.resources de Rail. Mais il y a des cas où je voudrais utiliser un identifiant non numérique dans mes itinéraires. Par exemple, si un itinéraire imbriqué est composé d’utilisateurs et de leurs articles, un itinéraire standard peut être écrit comme tel:

map.resources :users, :has_many => [:articles] # => e.g. '/users/:id/articles/:id'

Cependant, il existe de nombreux avantages / raisons de ne pas utiliser l'identifiant numérique par défaut généré par Rails. Existe-t-il un moyen de remplacer le paramètre default: id params par un autre identificateur canonique de mon choix sans entraîner l'écriture de routes personnalisées pour chaque action standard? Dites si je veux un itinéraire au format suivant:

'/users/:login/articles/:id'

Ce type de route est-il réalisable avec map.resources ?

Était-ce utile?

La solution

À partir de Rails 2.3, il est impossible de modifier le nom du paramètre et de continuer à utiliser le routage automatique fourni par #resources .

Pour contourner le problème, vous pouvez mapper les articles avec un : préfixe chemin et un : préfixe nom :

map.resources :articles, :path_prefix => "/users/:login",
                         :name_prefix => "user_"

Le : path_prefix affecte l'URL, et le : name_prefix affecte les itinéraires nommés générés. Vous obtiendrez ainsi ces itinéraires:

    user_articles GET    /users/:login/articles(.:format)          {:controller=>"articles", :action=>"index"}
                  POST   /users/:login/articles(.:format)          {:controller=>"articles", :action=>"create"}
 new_user_article GET    /users/:login/articles/new(.:format)      {:controller=>"articles", :action=>"new"}
edit_user_article GET    /users/:login/articles/:id/edit(.:format) {:controller=>"articles", :action=>"edit"}
     user_article GET    /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"show"}
                  PUT    /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"update"}
                  DELETE /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"destroy"}

En règle générale, cependant, je resterais fidèle à la convention par défaut de : identifiant_utilisateur de Rails, avec le routage que vous avez indiqué dans votre question. Il est généralement admis que : id et : id_utilisateur n'impliquent pas nécessairement "identificateur numérique". - ils impliquent " identifiant de ressource, " peu importe ce que cela pourrait être. Et si vous vous en tenez à la convention par défaut, votre code sera plus facile à comprendre pour quiconque utilise des itinéraires de ressources dans Rails.

Pour utiliser un identifiant non numérique pour une ressource, redéfinissez simplement #to_param dans votre modèle. Veillez ensuite à utiliser dans votre contrôleur un chercheur qui trouvera cet identifiant (plutôt que l'ID numérique), tel que Utilisateur # find_by_login! .

Autres conseils

Vous pouvez modifier la valeur par défaut d'utilisation de l'ID dans les URL en remplaçant to_param dans votre modèle. par exemple

class User < ActiveRecord::Base
  def to_param
    login
  end
end

user_articles_path(@user) => "/users/:login/articles"

Le seul autre changement à effectuer consiste à rechercher des utilisateurs par login plutôt que par ID dans vos contrôleurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top