На каком пути установлен встраиваемый двигатель - PullRequest
9 голосов
/ 28 сентября 2011

Мне нужно знать, из схемы компоновочного двигателя, на каком пути он сейчас монтируется. Каков был бы способ сделать это?

например. мой rout.rb содержит следующую строку:

  mount BackendCore::Engine => "/backend"

Изнутри BackendCore мне нужен доступ к значению "/backend".

Ответы [ 4 ]

10 голосов
/ 08 февраля 2012

Если двигатель заглушен :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"

Примечание: будьте осторожны, в рабочем режиме классы в вашем движке оцениваются перед загрузкой маршрутов основного приложения. Вызов этого метода в макросах классов может не сработать!

8 голосов
/ 28 сентября 2011

ОБНОВЛЕНИЕ: это, вероятно, относится только к Rails 3!

Я нашел решение:

Rails.application.routes.named_routes[:backend_core].path #=> "/backend"
4 голосов
/ 10 марта 2016

Оценка маршрутов для получения пути монтирования может дать неожиданные результаты, когда двигатели смонтированы внутри других двигателей.

Когда вы посмотрите на https://github.com/rails/rails/pull/5008, вы можете прочитать комментарий Хосе Валима:

Кроме того, двигатель может быть установлен внутри другого двигателя, поэтому маловероятно, что это даст вам правильный результат. Наилучшим вариантом, вероятно, является вариант конфигурации, в котором разработчик задает путь.

Для получения стабильных результатов я сейчас использую аксессор на движке.

Например:

# 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
0 голосов
/ 14 мая 2016

Вы можете просто использовать следующий код, чтобы указать, какой путь двигатель монтируется внутри контроллера / вида двигателя:

env["SCRIPT_NAME"] # => "/backend"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...