gpt4 book ai didi

ruby-on-rails - rails 3.1 : Better way to expose an engine's helper within the client app

转载 作者:行者123 更新时间:2023-12-03 10:33:48 24 4
gpt4 key购买 nike

我发现一些文章解决了引擎中的助手无法被消费(父)应用程序访问的问题。为了确保我们都在同一页面上,假设我们有这个:

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

如果你看 rails engine “隔离引擎的助手”(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 方法添加到父应用程序的应用程序助手中。但是,它不起作用。谁能帮我弄清楚为什么这个更好的解决方案不起作用?

我正在使用 Rails 3.1.3 运行 ruby​​ 1.8.7。如果我错过了与该问题密切相关的任何重要信息,请告诉我,并提前致谢。

最佳答案

您可以创建一个初始化程序来完成此操作,如下所示:

module MyEngine
class Engine < Rails::Engine
initializer 'my_engine.action_controller' do |app|
ActiveSupport.on_load :action_controller do
helper MyEngine::ImportantHelper
end
end
end
end

关于ruby-on-rails - rails 3.1 : Better way to expose an engine's helper within the client app,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8797690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com