Rails 3.2 Engines - маршруты не работают в тестовых примерах

Я смонтировал в своем приложении движок RailsAdmin (по инструкции из вики), используя

mount RailsAdmin::Engine => '/backend', :as => 'rails_admin'

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

Однако у меня возникла проблема с написанием функциональных тестов с использованием Test::Unit для моего файла before_filter. Фильтр срабатывает в нужный момент и работает так, как ожидалось, но как только действие, «настроенное» фильтром до, перенаправляется на индекс (что является ожидаемым результатом), я получаю следующую ошибку маршрутизации:

ActionController::RoutingError: маршрут не соответствует {:controller=>"rails_admin/main"}

Код, приводящий к исключению, заключается в методе движка для перенаправления на индекс или на предыдущую страницу (вид реферера); вот код метода

защита back_or_index

если params[:return_to].presence

параметры[:return_to]

еще

index_path

конец

Я обнаружил, что при запуске приложения в разработке вызов url_for, инициированный index_path, поставляется с правильными path_segments (т. е.: :model_name => 'user'), чтобы указанный ниже маршрут соответствовал

   index GET|POST    /:model_name(.:format)                 rails_admin/main#index

С другой стороны, при выполнении тестов path_segments не предоставляются, поэтому ограничение :model_name не выполняется при поиске соответствующего маршрута.

Поскольку я новичок в двигателях, может ли кто-нибудь сказать мне, что мне не хватает?

Мне кажется, что движок должен учитывать тот факт, что он монтируется, генерируя index_path, но, как я уже сказал, я не эксперт в этом....


person Cec    schedule 11.01.2013    source источник
comment
Вы пытались использовать метод use_route в вызове спецификации вашего контроллера? Вот пример из двигателя, над которым я работал. github.com/twinge/questionnaire_engine/blob/engine/spec/   -  person westonplatter    schedule 07.02.2013
comment
Спасибо за ответ, я уже разобрался с этим, но спасибо!   -  person Cec    schedule 07.02.2013
comment
Каково было решение?   -  person westonplatter    schedule 08.02.2013
comment
Посмотрите на мой ответ   -  person Cec    schedule 08.02.2013


Ответы (1)


use_route было недостаточно: вызов index_path все равно терпел неудачу.

После многочисленных отладок я еще не совсем уверен в первопричине того, почему один и тот же код не работал как в тестировании, так и в разработке.

Я заметил, что index_path в development может вывести model_name из URL-адреса запроса, в то время как в test это не так.

Хотя это и уродливо, мое решение состояло в том, чтобы переопределить метод следующим образом в app/controllers/rails_admin/main_controller.rb

module RailsAdmin
 class MainController

        # Override to fix a routing error when running tests
    def back_or_index
      if params[:return_to].presence && params[:return_to].include?(request.host) && (params[:return_to] != request.fullpath)
        params[:return_to]
      else
        # forward :model_name as default_url_options is not aware of it in tests
        index_path( :model_name => params[:model_name] )
      end
    end

 end
end

В моих спецификациях контроллера для MainController я делаю следующее

put :edit, { :model_name => 'user', :id => root.id, :user => { :role => :root }, :use_route => :rails_admin }

И это то, что у меня есть в моих маршрутах

  devise_for :users
  mount RailsAdmin::Engine => '/backend', :as => 'rails_admin'
  mount Rich::Engine => '/rich', :as => 'rich'

Если у кого-то есть лучшее решение, обмен будет очень признателен!

person Cec    schedule 08.02.2013