Rails 3.1: Лучший способ раскрыть хелпер движка в клиентском приложении

Я нашел несколько статей, в которых рассматривается проблема недоступности помощников внутри движка для потребляющего (родительского) приложения. Чтобы убедиться, что мы все на одной странице, давайте скажем следующее:

module MyEngine
  module ImportantHelper
    def some_important_helper
      ...do something important...
    end
  end
end

Если вы посмотрите документацию по движку rails engine в разделе "Isolated engine's helpers" (L293), там говорится:

  # Sometimes you may want to isolate engine, but use helpers that are defined for it.
  # If you want to share just a few specific helpers you can add them to application's
  # helpers in ApplicationController:
  #
  # class ApplicationController < ActionController::Base
  #   helper MyEngine::SharedEngineHelper
  # end
  #
  # If you want to include all of the engine's helpers, you can use #helpers method on an engine's
  # instance:
  #
  # class ApplicationController < ActionController::Base
  #   helper MyEngine::Engine.helpers
  # end

Итак, если я попрошу кого-либо, потребляющего мой движок, добавить это в application_controller. rb, то они получат доступ ко всем моим важным вспомогательным методам:

class ApplicationController < ActionController::Base
  helper MyEngine::ImportantHelper
end

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

module MyEngine
  class Engine < Rails::Engine
    isolate_namespace MyEngine

    config.to_prepare do
      ApplicationController.helper(ImportantHelper)
    end
  end
end

Теперь это именно то, что я хочу: добавить все мои методы ImportantHelper в помощник приложения родительского приложения. Однако это не работает. Может ли кто-нибудь помочь мне понять, почему это более лучшее решение не работает?

Я использую ruby 1.8.7 с rails 3.1.3. Дайте мне знать, если я пропустил какую-либо важную информацию, имеющую отношение к проблеме, и заранее спасибо.

25
задан Brad Werth 26 August 2014 в 02:44
поделиться

2 ответа

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

module MyEngine
  class Engine < Rails::Engine
    isolate_namespace MyEngine

    config.to_prepare do
      MyEngine::ApplicationController.helper Rails.application.helpers
    end

  end
end
6
ответ дан 28 November 2019 в 18:31
поделиться

Включить этот код в engine.rb также очень полезно.

config.before_initialize do
  ActiveSupport.on_load :action_controller do
    helper MyEngine::Engine.helpers
  end
end

В основном ваш движок будет выглядеть как

module MyEngine
  class Engine < Rails::Engine
    isolate_namespace MyEngine

    # Here comes the code quoted above 

  end
end
.
1
ответ дан 28 November 2019 в 18:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: