123 votes

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

Je regardai autour de moi sur la façon de changer la dynamique params fente et trouvé ce post qui fait la chose exacte. Le poste est http://robots.thoughtbot.com/post/159809070/rails-patch-change-the-name-of-the-id-parameter-in

Essentiellement, ce qu'il n'est, le cas suivant est le parcours:

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 de créer des chemins d'accès suivants:

/clients/:client_name
/clients/:client_name/sites/:name
/clients/:client_name/sites/:site_name/articles/:title

Une solution est de remplacer l' def to_param méthode dans le modèle, mais je veux que ce sans toucher au modèle lui-même.

Mais depuis son pour Rails 2.x, comment puis-je obtenir le même pour Rails 3?

Mise à jour

Cette application est à l'aide de Mongoid. Pas d'AR. Donc, le gem amicale ne peut pas être utilisé autant que je sache.

209voto

joshhepworth Points 672

Rails 3

Malheureusement, dans Rails 3, l' :key option pour resources a été supprimée, de sorte que vous pouvez plus facilement changer de nom pour les itinéraires créés de cette façon, par passage dans une option supplémentaire.

Rails 4

Tout n'est pas perdu, cependant, il semble que dans les Rails 4, l' :param option a été ajoutée, ce qui semble faire exactement ce que vous cherchez. Vous pouvez prendre un coup d'oeil à l' Rails 3, du code par rapport à l' Rails 4 code.

Rails 3 (Détails)

Je suppose que vous avez déjà en quelque sorte obtenu l'application fonctionne comme vous le souhaitez dans la dernière année, mais je vais aller dans un moyen d'obtenir l'effet que vous décrivez dans Rails 3 routes.rb. Il faudra juste s'impliquer un peu plus de travail que l' to_param méthode. Vous pouvez définir des paramètres personnalisés dans les itinéraires définis à l'aide de scope et match (ou les cousins get, put, post, et delete). Il suffit d'écrire dans le nom du paramètre que vous voulez dans le comparateur de:

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 tous les itinéraires resources crée automatiquement pour vous, mais il permettrait de réaliser ce que vous cherchez. Vous pourriez également utiliser efficacement l' :controller option avec scope supplémentaires et scope blocs de prendre certaines de la répétition.

EDIT (8 Mai 2014): le Rendre plus évidente la réponse contient des informations pour les deux Rails 3 et 4. Mettre à jour les liens vers le code pour aller à l'exacte des numéros de ligne et s'engage, de sorte qu'ils doivent travailler pour une plus longue période de temps.

48voto

bobzsj87 Points 444

dans Rails 4, passez l’option param pour changer les paramètres: id. Par exemple, resources :photos, param: :photo_name générera / photos /: nom_photo

1voto

Frost Points 4169

Il y a un plugin pour ça, tout comme il y a un plugin pour tout ;)

J'ai été en utilisant FriendlyId pour ce genre de comportement dans rails 3.

Il va vous obliger à ajouter du code dans votre modèle, bien que, comme ceci:

class Client < ActiveRecord::Base
  has_friendly_id :name
end

...et si vos clients n'ont pas de URI compatible noms, vous pourriez vouloir utiliser un slug pour que, qui que vous pouvez faire avec has_friendly_id :name, :use_slug => true. Lors de l'utilisation de limaces, vous aurez évidemment besoin de persister en base de données ainsi que.

Et comme déjà mentionné, vous pouvez toujours utiliser l' to_param truc avec rails 3, comme indiqué ici. Je trouve FriendlyId un peu plus polyvalent.

1voto

Mohit Jain Points 9959

Si je vous comprends bien, ce que vous voulez est d’avoir le au lieu de dans votre url, à droite ?

Vous pouvez le faire en substituant la `` méthode dans votre modèle. Vous pouvez obtenir plus d’informations ici.

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