9

マウント可能なエンジンのレイアウトの内側から、現在マウントされているパスを知る必要があります。それを行う方法は何でしょうか?

たとえば、私のroutes.rbには次の行が含まれています。

  mount BackendCore::Engine => "/backend"

BackendCoreの内部から、「/backend」の値にアクセスする必要があります。

4

4 に答える 4

10

エンジン: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"

注:本番モードでは、メインアプリのルートが読み込まれる前に、エンジンのクラスが評価されることに注意してください。クラスマクロでこのメソッドを呼び出すと、機能しない場合があります。

于 2012-02-08T12:26:23.673 に答える
8

更新:これはおそらくRails 3にのみ適用されます!

私は解決策を見つけました:

Rails.application.routes.named_routes[:backend_core].path #=> "/backend"
于 2011-09-28T09:09:06.620 に答える
3

マウントパスを取得するためにルートを評価すると、エンジンが他のエンジン内にマウントされている場合に予期しない結果が生じる可能性があります。

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
于 2016-03-10T12:54:20.610 に答える
0

次のコードを使用して、エンジンコントローラー/ビュー内でどのパスエンジンがマウントされているかを確認できます。

env["SCRIPT_NAME"] # => "/backend"
于 2016-05-14T16:27:32.200 に答える