我正在将Rails插件升级为与最新的3.0RC1版本兼容的引擎,并且在找出扩展ActionController
的最佳(也是最正确的)方法时遇到了一些麻烦。我已经在DHH上看到了DHH和this post的this question,但是我的问题更多是关于如何在ActionController
内正确调用代码。
例如,我需要在引擎 Controller 内调用以下命令:
class ApplicationController < ActionController::Base
helper :all
before_filter :require_one_user
after_filter :store_location
private
def require_one_user
# Code goes here
end
def store_location
# Code goes here
end
end
我知道如何正确包含我的两个私有(private)函数,但是我找不到找到正确调用
helper
,before_filter
和after_filter
的方法。我将不胜感激一些链接或一种使之起作用的方法。我尝试给 Controller 命名为
ApplicationController
以外的其他名称,并让真正的ApplicationController
对其进行扩展,但这似乎也不起作用。我真的想使用任何使引擎用户的生活尽可能轻松的解决方案。理想情况下,他们不必扩展我的类(class),但他们会将所有功能内置到自己的ApplicationController
中。 最佳答案
您可能还需要研究引擎子类中的初始化器,因此不必在 Controller 类中包括 View 帮助器。这将使您可以控制这些模块的加载顺序。
这是我一直在使用的:module MyEngine class Engine < Rails::Engine initializer 'my_engine.helper' do |app| ActionView::Base.send :include, MyEngineHelper end initializer 'my_engine.controller' do |app| ActiveSupport.on_load(:action_controller) do include MyEngineActionControllerExtension end end endend
另外, Action Controller 扩展的另一个选项是使用mixin模块。这将使您可以使用before_filter,after_filter等。module MyEngineActionControllerExtension def self.included(base) base.send(:include, InstanceMethods) base.before_filter :my_method_1 base.after_filter :my_method_2 end module InstanceMethods #........... endend
另一件事...如果您在gem的顶层创建默认的rails目录,则不必担心需要助手或 Controller 。您的引擎子类可以访问它们。所以我在这里添加我的应用程序 Controller 和应用程序帮助程序扩展:
/myengine/app/helpers/myengine_application_helper_extension.rb
/myengine/app/controllers/my_engine_action_controller_extension.rb
我喜欢此设置,因为它看起来与Rails应用程序中的application_controller和application_helper相似。同样,这只是个人喜好,但我尝试将与Rails直接相关的所有内容(例如,/my_engine/app内的 Controller ,帮助程序和模型,以及与该插件相关的所有内容,通常保留在/my_engine/lib内)
请查看Jose Valim的本教程,以获取有关初始化程序的更多信息:
https://gist.github.com/e139fa787aa882c0aa9c(现在已弃用engine_name,但是此文档中的大多数似乎都是最新的)
关于ruby-on-rails - Rails 3.0 Engine-在ActionController中执行代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3468858/