マウント可能なエンジンのレイアウトの内側から、現在マウントされているパスを知る必要があります。それを行う方法は何でしょうか?
たとえば、私のroutes.rbには次の行が含まれています。
mount BackendCore::Engine => "/backend"
BackendCoreの内部から、「/backend」の値にアクセスする必要があります。
マウント可能なエンジンのレイアウトの内側から、現在マウントされているパスを知る必要があります。それを行う方法は何でしょうか?
たとえば、私のroutes.rbには次の行が含まれています。
mount BackendCore::Engine => "/backend"
BackendCoreの内部から、「/backend」の値にアクセスする必要があります。
エンジン:as =>
に別の名前が付けられている場合、クエリnamed_routes
は十分ではありません。このモンキーパッチは次のことを行います。
class Rails::Engine
def self.mounted_path
route = Rails.application.routes.routes.detect do |route|
route.app == self
end
route && route.path
end
end
mounted_path
次に、エンジンを呼び出します。
BackendCore::Engine.mounted_path => "/backend"
注:本番モードでは、メインアプリのルートが読み込まれる前に、エンジンのクラスが評価されることに注意してください。クラスマクロでこのメソッドを呼び出すと、機能しない場合があります。
更新:これはおそらくRails 3にのみ適用されます!
私は解決策を見つけました:
Rails.application.routes.named_routes[:backend_core].path #=> "/backend"
マウントパスを取得するためにルートを評価すると、エンジンが他のエンジン内にマウントされている場合に予期しない結果が生じる可能性があります。
https://github.com/rails/rails/pull/5008を見ると、JoseValimのコメントを読むことができます。
また、エンジンを別のエンジンの中に取り付けることができるため、これで適切な結果が得られる可能性はほとんどありません。おそらく最良のオプションは、開発者がパスを設定する構成オプションを持つことです。
一貫した結果を得るために、私は現在、エンジンにアクセサーを使用しています。
例えば:
# APP/initializers/backend_core_engine.rb
BackendCore::Engine.mount_path = "/backend"
# APP/config/routes.rb
mount BackendCore::Engine => BackendCore::Engine.mount_path
# ENGINE/backend_core/lib/engine.rb
module BackendCore
class Engine < ::Rails::Engine
cattr_accessor :mount_path
end
end
次のコードを使用して、エンジンコントローラー/ビュー内でどのパスエンジンがマウントされているかを確認できます。
env["SCRIPT_NAME"] # => "/backend"