1

RailsAdminエンジン(wikiの指示に従って)を使用してアプリにマウントしました

RailsAdmin :: Engine =>'/ backend'、:as=>'rails_admin'をマウントします

before_filterを追加するには、エンジンから1つのコントローラーを拡張する必要がありました。開発中のアプリを実行しているとき、拡張機能とその他のエンジン機能は完全に機能しています。

ただし、before_filterにTest::Unitを使用して機能テストを作成する際に問題が発生します。フィルタは適切なタイミングで起動し、期待どおりに機能しますが、beforeフィルタによって「微調整」されたアクションがインデックスにリダイレクトされると(これは期待される結果です)、次のルーティングエラーが発生します。

ActionController :: RoutingError:一致するルートがありません{:controller => "rails_admin / main"}

例外につながるコードは、インデックスまたは前のページ(リファラーの一種)にリダイレクトするエンジンのメソッドにあります。これがメソッドのコードです

def back_or_index

params [:return_to].presenceの場合

params [:return_to]

そうしないと

index_path

終わり

開発中のアプリを実行すると、index_pathによってトリガーされるurl_for呼び出しに適切なpath_segments(つまり、:model_name =>'user')が提供されるため、以下のルートが一致することがわかりました。

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

一方、テストを実行する場合、path_segmentsが提供されないため、一致するルートを探すときに:model_name制約が満たされません。

私はエンジンに慣れていないので、誰かが私が欠けているものを教えてもらえますか?

私には、エンジンがindex_pathを生成するためにマウントされているという事実を考慮に入れる必要があるように見えますが、私が言ったように、私はこれの専門家ではありません...。

4

1 に答える 1

2

use_routeは十分ではありませんでした:index_pathへの呼び出しはとにかく失敗していました。

多くのデバッグを行った後、同じコードがテスト開発の両方で機能しなかった根本的な原因については、まだ完全にはわかりません。

私が観察したのは、開発中のindex_pathはリクエストのURLからmodel_nameを推測できるのに対し、テスト中はそうではないということです。

醜いですが、私の解決策は、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'

誰かがより良い解決策を持っているなら、共有は本当にありがたいです!

于 2013-02-08T09:28:33.167 に答える