2011-09-22 3 views
0

j'ai une ressource scope dans mon dossier de routes:Rails 3 - Aides d'URL avec Scoped ressources

scope :module => "physical" do 
    resources :mymodels 
end 

En utilisant '> routes râteau' Je reçois les itinéraires standards, y compris:

mymodel GET /mymodels/:id(.:format) {:action=>"show", :controller=>"physical/mymodels"} 

Cependant lorsque j'utilise la console (ce qui est ce qui ne dans mes tests) pour obtenir l'URL pour les instances de MyModel je reçois des erreurs:

> m = Physical::Mymodel.new 
> => {...model_attributes...} 
> m.save 
> => true 
> app.url_for(m) 
> NoMethodError: undefined method `physical_mymodel_url' for #<ActionDispatch::Integration::Session:0x00000105b15228> 
from /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.7/lib/action_dispatch/testing/assertions/routing.rb:175:in `method_missing' 
from /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.7/lib/action_dispatch/routing/polymorphic_routes.rb:114:in `polymorphic_url' 
from /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.7/lib/action_dispatch/routing/url_for.rb:133:in `url_for' 
from (irb):13 
from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/commands/console.rb:44:in `start' 
from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/commands/console.rb:8:in `start' 
from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/commands.rb:23:in `<top (required)>' 
from script/rails:6:in `require' 
from script/rails:6:in `<main>' 

Cela peut être un gotcha, mais Mymodel est également une sous-classe utilisant l'héritage de table unique Rails standard.

Des pensées? Pourquoi cherche-t-il physical_mymodel_url au lieu de mymodel_url? Des idées pour les solutions de contournement afin que je puisse toujours utiliser les routes non préfixées?

Répondre

2

Vous êtes seulement en utilisant le champ pour lui dire le module où le contrôleur se trouve dans Si vous voulez utiliser le préfixe physical sur vos itinéraires, vous pouvez le faire.

scope :module => "physical", :as => "physical" do 
    resources :mymodel 
end 

Alternativement, vous pouvez simplement utiliser la méthode namespace qui fera la même chose:

namespace :physical do 
    resources :mymodel 
end 
+0

Je veux * * OMMISSIONS le préfixe sur la méthode d'aide d'itinéraire. Il semble s'attendre à physical_mymodel_url basé sur le message d'erreur, quand je veux qu'il utilise mymodel_url. mymodel_url devrait fonctionner en fonction de la sortie des routes rake. –

+1

Il s'avère que la méthode url_for appelle la méthode plurielle ActiveRecord :: Naming sur la classe ActiveRecord. Cela retourne "physical_mymodels" qui est la base pour le reste de la logique d'URL. Il n'y a pas du tout de lien avec le fichier routes, donc il n'y a aucun moyen de savoir que le modèle n'utilise pas le préfixe. On dirait que j'ai besoin d'utiliser les chemins préfixés en utilisant la solution de Ryan Bigg ou de modifier la base ActiveRecord pour tous les modèles dans le module physique pour remplacer l'url_for et enlever le préfixe du module. –

Questions connexes