質問

Railsエンジンを統合しようとしているRailsアプリがあります。

ホストアプリには、すべてのルートがいくつかあります。

  # magic urls
  match '/' => 'admin/rendering#show'
  match '*path/edit' => 'admin/rendering#show', :defaults => { :editing => true }
  match '*path' => 'admin/rendering#show'

アプリケーションがすべてのルートをキャッチした後、エンジンルートはロードされているようです。

/sitemap.xml(.:format)                                            {:format=>"xml", :controller=>"admin/sitemaps", :action=>"show"}
                              /(.:format)                                                       {:controller=>"admin/rendering", :action=>"show"}
                              /*path/edit(.:format)                                             {:controller=>"admin/rendering", :action=>"show"}
                              /*path                                                            {:controller=>"admin/rendering", :action=>"show"}
           engine_envs GET    /engine/envs/:id(.:format)                                       {:controller=>"engine/envs", :action=>"show"}
                       PUT    /engine/envs/:id(.:format)                                       {:controller=>"engine/envs", :action=>"update"}
                jammit        /assets/:package.:extension(.:format)                             {:extension=>/.+/, :controller=>"jammit", :action=>"package"}

これまでのところ、すべてがヒットしています /engine/envs アプリケーションがすべてのルートをキャッチすることにより、ルートが捉えられています。しかし、私はジャムミットルートがエンジンの後にロードされていることがわかります、そして、私はそれらが捕まっているとは思わない。アプリルートをオーバーライドする方法はありますか?

役に立ちましたか?

解決

メソッドにエンジンルートを貼り付けてから、ホストアプリでそれを呼び出すことができます。

# engine routes.rb
module ActionDispatch::Routing
  class Mapper
    def engine_routes
      engine_envs GET    /engine/envs/:id(.:format)
      # ...
    end 
# ...

そして、ホストアプリでキャッチオールルートの前にメソッドを追加します

# host app routes.rb
MyTestApp::Application.routes.draw do
  # ... 

  engine_routes

  match '/' => 'admin/rendering#show'
  match '*path/edit' => 'admin/rendering#show', :defaults => { :editing => true }
  match '*path' => 'admin/rendering#show'
end

他のヒント

ルートは、定義されている順序で使用されます。最初に読まれるルートは、ホストアプリケーションの1つであり、次にエンジンの1つです。

一致するルートが見つかるとすぐに、ルートの検索が停止します。

私の知る限り、あなたの「雑誌を変更する以外にこの機能を無効にする方法はありません(私はこれについて間違っているかもしれません)

更新:つまり、「Rake Routes」で表示される順序は、処理される順序です。一致するルートが見つかるとすぐに、そこに行きます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top