web-dev-qa-db-fra.com

Modifiez le nom du paramètre: id dans Ressources de routage pour Rails

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.

99
Autodidact

Rails 4 et 5

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 .

Détails

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) .

Rails 3

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.

Détails

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.

182
joshhepworth

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

43
bobzsj87

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.

1
Frost

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 .

1
Mohit Jain

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
0
Dominik Goltermann