rails3 выдача маршрутов - PullRequest
0 голосов
/ 17 августа 2010

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

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

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

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

Приведенный выше код отлично работает в rails 2.x.Однако, если я использую rails3, я получаю следующую ошибку

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

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

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

В классе, таком как Vehicle :: Car, который я делаю

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

Это подчеркивание и верблюд /константирование с другой стороны облегчает передачу имени вложенного класса.

Есть идеи о том, как исправить это для rails3?

1 Ответ

2 голосов
/ 20 августа 2010

СТОП!

Подумайте о том, что вы здесь делаете - вы не должны вызывать constantize для параметров URL. Предполагая, что вы, вероятно, будете вызывать функцию find для результата, вы в основном предоставляете хакеру способ запрашивать каждую модель 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-адресов на основе переданного экземпляра модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...