2010-08-17 2 views
0

У меня есть следующие маршруты.rails3 route issue

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

Когда я реки маршруты это то, что я получаю для шоу-методы:

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

Над кода отлично работает в рельсах 2.x. Однако, если я использую rails3, тогда я получаю следующую ошибку:

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

Обратите внимание, что я передаю «автомобиль/дверь» как: класс. Если я передаю стандартную модель, например: klass => 'pet', тогда она отлично работает. Однако, если я передаю вложенное имя модели, например: klass => 'vehicle/door', тогда я получаю ошибку маршрута в rails3.

Я думаю, это потому, что у меня есть значение «/». Я могу решить это, имея регулярное выражение, но я могу также передать: klass, который не является вложенным.

Об одном классе, как Vehicle :: Автомобиль я

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

Это подчеркивание и camelize/constantize с другой стороны делает его легче передать вложенное имя класса.

Любая идея о том, как это сделать для рельсов3?

ответ

2

STOP!

Подумайте, что вы здесь делаете - вы не должны называть константизацию по параметрам url. Предполагая, что вы, вероятно, будете называть результат, вы в основном предоставляете хакеру способ запросить каждую модель ActiveRecord в вашем приложении.

Лучший способ заключается в использовании мета-программирования, чтобы динамически создавать статические маршруты, которые не могут быть взломаны, например:

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

Затем вы можете добавить вспомогательный метод, который вызывает соответствующий имени маршрут помощника для создания URL-адресов основанный на переданном экземпляре модели.