我正在将Rails插件升级为与最新的3.0RC1版本兼容的引擎,并且在找出扩展ActionController的最佳(也是最正确的)方法时遇到了一些麻烦。我已经在DHH上看到了DHH和this postthis 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)函数,但是我找不到找到正确调用helperbefore_filterafter_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/

10-16 10:04