あなたがしようとしていることは、ちょっと難しいことです。前述したように、エンジンのルートは、アプリのルートの後に読み込まれ、この動作をオーバーライドすると問題がある可能性があります。私はあなたが試すことができるいくつかのことを考えることができます。ルーティングパス初期化子後
レールソース内部engine.rb
における初期化子はあなたが後にしているものを達成する一つの方法は、それが扱っ機能をフックしようとすることです、があります。初期化子は、デフォルトでは次のようになります。
initializer :add_routing_paths do |app|
paths.config.routes.to_a.each do |route|
app.routes_reloader.paths.unshift(route) if File.exists?(route)
end
end
基本的に、これはRailsが知っていることをファイルすべてのルートへのパスを取得し、試してみて、ルートのリロード機能にそれらを追加する必要があります(あなたのルートをreloades事がのために自動的にファイルあなたが変更された場合はあなたに)。この直後に別のイニシャライザを定義して、ルートリローダに格納されているパスを調べ、エンジンに属するパスを取り出し、パス配列から削除して最後に挿入しますパス配列のだから、あなたのconfig/application.rb
に:
class Application < Rails::Application
initializer :munge_routing_paths, :after => :add_routing_paths do |app|
engine_routes_path = app.routes_reloader.paths.select{|path| path =~ /<regex that matches path to my engine>/}.first
app.routes_reloader.paths.delete(engine_routes_path)
app.routes_reloader.paths << engine_routes_path
end
end
これは、または、私は実際にそれをお勧めしませんいずれかのように動作しない可能性があり、それは(レールの根性で遊んすなわち醜いハック)特にエレガントではありません。
利用のRails 3.1
これはオプションではないかもしれないが、それであれば、私はおそらく、この1で行くだろう。 Rails 3.1では、フルとマウント可能な2種類のエンジンを用意しています(ここではan SO question talking about some of the differencesです)。しかし、本質的にエンジンをマウント可能なエンジンに変更すると、マウント可能なエンジンのルートは名前空間になり、メインアプリケーションのルートファイルに明示的に含めることができます。:
Rails.application.routes.draw do
mount MyEngine::Engine => "/news"
end
あなたはまた、スコープは、あなたのエンジンのルートをマウントし、他の空想routyもの(詳細here)のすべてのソートを行うことができます。短いストーリー、あなたが3.1に行くことができるなら、これは使用するアプローチです。
動的た瞬間に周りの最もよく知られているRailsのエンジンのあなたの主なアプリケーション
一つにあなたのエンジンからのルートを挿入しますが考案です。今、deviseはあなたのアプリにかなりのルートを追加する可能性のあるエンジンですが、あなたがdeviseソースを見ると、実際にはconfig/routes.rb
というファイルはまったくありません。これは、deviseがメインアプリのroutes.rb
ファイルにルーティングの良さを動的に追加するためです。
あなたは工夫が付属したモデルジェネレータを実行すると、発電機がどうなるものの一つは、右Rails.application.routes.draw do
行の後、あなたのroutes.rbをファイルの先頭に、このようなdevise_for :model
などの行を追加しています。
今 Rails.application.routes.draw do
devise_for :users
...
end
、devise_for(lib/devise/rails/routes.rb
中)工夫の一環として、来る魔法の方法であるが、本質的にそれは以下となります。だからあなたのroute.rbを使用すると、Userモデルを作成するための発電機を実行した後、このようになります私たちが皆さんが生成したモデルに基づいて知っている一連の定期的なルートを作成してください。
私たちが知る必要があることは、アプリケーションroutes.rb
ファイルにこの行を挿入する方法です。その後、メインアプリケーションroutes.rb
ファイルの先頭にルートを挿入するジェネレータをエンジンに書き込むことができます。これについてはlib/generators/devise/devise_generator.rb
をご覧ください。 add_devise_routes
メソッドでは、最後の行はroute devise_route
です。 Route
は、渡された文字列をメインアプリのroutes.rb
ファイルに挿入するThorアクションです。だから我々は我々自身の発電機を書き込み、例えば似た何かを行うことができます。:
もちろん class MyCrazyGenerator < Rails::Generators::NamedBase
...
def add_my_crazy_routes
my_route = "match '/news', :to => 'bar_controller#foo_action'"
route my_route
end
end
あなたは必ずすべての発電インフラが整備されているが、それはそれの本質だようにする必要があります。 Deviseはいくつかの非常にスマートなレールで書かれており、かなり多くの人が使用しています。私がこれを提案した3つのことのうち、私はあなたの問題を扱う方法です(レール3.1への移行はおそらくオプションではないと考えられるので)。
http://edgeguides.rubyonrails.org/configuring.htmlを見てみましたか?私はあなたがフックとイニシャライザを使って何をしたいのかをかなり確信しています –
それはhttp://stackoverflow.com/questions/6310832/how-to-override-rails-app-routes-from-an-の複製ではありませんか?エンジン? –
ところで、私は、エンジンルートは常にアプリケーションルートの後に読み込まれると信じています。 –