J'ai regardé autour de moi pour savoir comment changer le slot de params dynamique et j'ai trouvé ce post qui fait exactement la chose. Le message est https://thoughtbot.com/blog/Rails-patch-change-the-name-of-the-id-parameter-in
Fondamentalement, ce qui est fait, si suit est les routes:
map.resources :clients, :key => :client_name do |client|
client.resources :sites, :key => :name do |site|
site.resources :articles, :key => :title
end
end
Ces itinéraires créent les chemins suivants:
/clients/:client_name
/clients/:client_name/sites/:name
/clients/:client_name/sites/:site_name/articles/:title
Une solution consiste à remplacer le def to_param
méthode dans le modèle, mais je veux cela sans toucher au modèle lui-même.
Mais puisque c'est pour Rails 2.x, comment puis-je obtenir la même chose pour Rails 3?
Mettre à jour
Cette application utilise Mongoid. Pas AR. Ainsi, le bijou amical ne peut pas être utilisé pour autant.
Dans Rails 4, l'option _:param
_ a été ajoutée, ce qui semble faire exactement ce que vous recherchez. Vous pouvez consulter le code Rails comparé à code Rails 4 .
Vous pouvez facilement l'implémenter dans votre fichier _routes.rb
_:
_# config/routes.rb
resources :posts, param: :slug
# app/controllers/posts_controller.rb
# ...
@post = Post.find_by(slug: params[:slug])
# ...
_
À compter de la sortie de Rails 4, cette fonctionnalité est documentée dans Rails Guides) .
Malheureusement, dans Rails 3, l'option _:key
_ de resources
a été supprimée. Vous ne pouvez donc plus modifier facilement le nom des itinéraires créés de cette manière en passant simplement dans une option supplémentaire.
Je suppose que l’application a déjà fonctionné comme vous le souhaitez au cours de la dernière année, mais je vais vous donner un moyen d’obtenir l’effet que vous décrivez dans Rails 3 dans _routes.rb
_. Cela impliquera un peu plus de travail que la méthode _to_param
_. Vous pouvez toujours définir des paramètres personnalisés dans les itinéraires définis à l'aide de scope
et match
(ou ses cousins get
, put
, post
et delete
). Vous écrivez simplement le nom du paramètre que vous voulez dans le matcher:
_get 'clients/:client_name', :to => 'clients#show', :as => client
scope 'clients/:client_name' do
get 'sites/:name', :to => 'sites#show', :as => site
end
_
Vous devez ajouter manuellement toutes les routes que resources
crée automatiquement pour vous, mais vous obtiendrez ce que vous recherchez. Vous pouvez également utiliser efficacement l'option _:controller
_ avec scope
et des blocs scope
supplémentaires pour éliminer une partie de la répétition.
EDIT (8 mai 2014): Rendez plus évident la réponse contient des informations pour les deux Rails 3 & 4. Mettez à jour les liens vers le code pour aller aux numéros de ligne exacts et aux commits, afin qu'ils puissent fonctionner pendant une période plus longue.
EDIT (16 novembre 2014): Rails 4 devrait être en haut à présent et inclure les informations pertinentes telles qu'elles ont été la version actuelle de Rails depuis un certain temps maintenant.
EDIT (9 août 2016): Indique que la solution fonctionne toujours dans Rails 5 et met à jour des liens obsolètes.
in Rails 4, option pass paramètre pour modifier les paramètres: id. Par exemple, resources :photos, param: :photo_name
générera/photos /: nom_photo
Il y a un joyau pour ça, tout comme il y en a un pour tout;)
J'utilise FriendlyId pour ce type de comportement dans Rails 3.
Il vous faudra cependant ajouter du code à votre modèle, comme ceci:
class Client < ActiveRecord::Base
has_friendly_id :name
end
... et si vos clients ne possèdent pas de noms compatibles URI, vous pouvez utiliser un slug pour cela, ce que vous pouvez faire avec has_friendly_id :name, :use_slug => true
. Lorsque vous utilisez des slugs, vous devrez évidemment les conserver également dans la base de données.
Et comme déjà mentionné, vous pouvez toujours utiliser le to_param
astuce avec Rails 3, comme documenté ici . Je trouve FriendlyId un peu plus polyvalent cependant.
Si je vous ai bien compris, vous voulez que le client_name
_ au lieu de id
dans votre URL, n'est-ce pas?
Vous pouvez le faire en remplaçant le to_param
méthode dans votre modèle. Vous pouvez obtenir plus d'informations ici .
Dans Rails 3, vous pouvez renommer les clés id à l'aide d'une combinaison d'espaces de noms et d'étendues comme celle-ci (ce qui n'est pas très gentil):
namespace :clients do
scope "/:client_name" do
namespace :sites do
scope "/:name" do
post "/:title" => "articles#create"
...
end
end
end
end