2010-08-17 5 views
0

J'ai les routes suivantes.rails3 routes numéro

pota.resources :on_k, 
       :as => ':klass', 
       :path_prefix => 'pota/klass', 
       :controller => 'main' 

Quand je fais des itinéraires de râteau ce que je reçois pour la méthode show:

pota_on_k GET /pota/klass/:klass/:id(.:format)    
       {:action=>"show", :controller=>"pota/main"} 

code ci-dessus fonctionne très bien dans des rails 2.x. Cependant si j'utilise rails3 alors je reçois l'erreur suivante

ActionController::RoutingError: No route matches 
{:action=>"show", :controller=>"pota/main", :klass=>"vehicle/door", :id=>1} 

Notez que je passe 'véhicule/porte' comme: klass. Si je passe un modèle standard comme: klass => 'pet' alors ça marche bien. Cependant, si je passe un nom de modèle imbriqué comme: klass => 'vehicle/door', alors je reçois une erreur de route dans rails3.

Je suppose que c'est parce que j'ai '/' dans la valeur. Je peux résoudre cela en ayant une regex mais je pourrais aussi passer: klass qui n'est pas imbriqué.

Sur une classe comme véhicule :: Car je fais

Vehicle::Car.underscore #=> vehicle/car 
"vehicle/car".camelize.constantize #=> Vehicle::Car 

Ce trait de soulignement et camelize/constantize de l'autre côté le rend plus facile à passer le nom de classe imbriquée.

Une idée sur la façon de s'y prendre pour la fixation de rails3?

Répondre

2

STOP! Pensez à ce que vous faites ici - vous ne devriez pas appeler constantize sur les paramètres d'URL. En supposant que vous êtes susceptible d'appeler find sur le résultat, vous donnez à un pirate un moyen d'interroger chaque modèle ActiveRecord dans votre application.

Une meilleure façon est d'utiliser la programmation méta pour construire dynamiquement des routes statiques qui ne peuvent pas être piraté, par exemple:

%w[pet vehicle/car vehicle/bike].each do |klass| 
    resources :pota, 
     :path => "pota/#{klass.pluralize}", 
     :as => "pota_#{klass.tr('/','_').pluralize}", 
     :defaults => { :klass => klass } 
    end 

Ensuite, vous pouvez ajouter une méthode d'assistance qui appelle l'assistant d'itinéraire nommé approprié pour générer urls basé sur une instance de modèle passée.