Le routage namedspaced a-t-il changé dans Rails 2.3?
-
05-07-2019 - |
Question
J'ai un espace de noms d'administrateur qui me donne les routes habituelles telles que admin_projects et admin_project, mais ils ne se comportent pas de la manière habituelle. Ceci est mon premier projet Rails 2.3, alors peut-être que je ne trouve aucune information via Google.
map.namespace(:admin) do |admin|
admin.resources :projects
end
Ce qui est étrange, c’est pour une URL donnée (par exemple. / admin / projects / 1). Je n’ai pas besoin de passer un objet pour obtenir une URL, il la devine en quelque sorte:
<%= admin_project_path %> # => /admin/projects/1
Pas de soucis, pas vraiment un problème, mais pas remarqué avant.
Mais si j'essaie de passer un objet comme d'habitude:
<%= admin_project_path(@project) %> # => admin_project_url failed to generate from {:controller=>"admin/projects", :action=>"show", :id=>#<Project id: 1, name: "teamc...>
": id " semble contenir l'objet entier, alors j'essaie de passer l'id directement et cela fonctionne:
<%= admin_project_path(@project.id) %> # => /admin/projects/1
Cela ne serait pas si grave, mais quand il s'agit de formulaires, j'utilise habituellement [: admin, @object], cependant:
<%= url_for [:admin, @project.id] %> # => undefined method `admin_fixnum_path'
Je ne peux donc pas transmettre d'identifiant, car il a besoin d'une classe d'objets pour déterminer la route à utiliser.
<%= url_for [:admin, @project] %> # => Unfortunately this yields the same error as passing a object to admin_project_path, which is what it is calling.
Je ne détecte aucune erreur et c'est assez standard alors je ne suis pas sûr de ce qui ne va pas ...
La solution
Intéressant. Que se passe-t-il lorsque vous définissez une méthode to_param
sur Project? Par exemple
class Project < ActiveRecord::Base
def to_param
self.id
end
end
Cela devrait être la valeur par défaut et cela ne devrait pas être nécessaire. Mais qu'advient-il si vous le rendre explicite? Essayez d’ajouter la méthode ci-dessus, puis revenez à votre approche originale consistant à ne faire circuler que @project
Autres conseils
Je voudrais pouvoir vous aider sur celui-ci. Nous avons une grande application avec plusieurs sections de noms-espacées. Nos itinéraires sont définis dans la méthode exacte que vous avez décrite et nous appelons notre assistant de chemin avec des objets. Nous n’avons pas accès à l’application avec l’identifiant dans l’application.
Notre application a démarré sous Rails 2.1 et est passée de 2.2 à 2.3 sans modification significative du routage. Désolé, je ne pourrais pas être plus utile.
Peer