На какой траектории устанавливается навесной двигатель

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

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

  mount BackendCore::Engine => "/backend"

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


person mxgrn    schedule 28.09.2011    source источник
comment
возможный дубликат маршрутизации Reverse rails: найдите название действия из URL   -  person Ben Lee    schedule 28.09.2011
comment
Приведенная вами ссылка мало чем помогает, так как не имеет ссылок на движки, хотя и дает направление для поиска.   -  person mxgrn    schedule 28.09.2011


Ответы (4)


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

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

person Christoph Petschnig    schedule 08.02.2012
comment
Использование этой техники в движках Rails 4. Спасибо! - person RailinginDFW; 03.12.2014

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

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

Rails.application.routes.named_routes[:backend_core].path #=> "/backend"
person mxgrn    schedule 28.09.2011
comment
Спасибо, дружище, мне очень помогло :) - person Ryan Bigg; 31.01.2012

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

Когда вы посмотрите на 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
person Koen.    schedule 10.03.2016

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

env["SCRIPT_NAME"] # => "/backend"
person Tian Chen    schedule 14.05.2016
comment
Не должно быть возможности получить отрицательный голос без объяснения причин. Как я могу доверять тому, имеет ли это отрицательный голос смысл или нет? - person a.barbieri; 30.11.2017