代码之家  ›  专栏  ›  技术社区  ›  Vitaly Kushner

如何在rails插件中正确扩展ActionController

  •  0
  • Vitaly Kushner  · 技术社区  · 17 年前

    我正在编写一个Rails插件(我们称之为Foo)。

    class ApplicationController
      bar ...
    end
    

    bar 在插件加载文件vendor/plugins/foo/init.rb中定义。有点像

    class ActionController::Base
      def self.bar
        ...
      end
    end
    

    foo并访问ApplicationController。

    因此,ApplicationController在插件“foo”之前加载,并且由于没有定义“bar”而失败 .

    所以。..我该怎么办 让它工作吗?

    我注意到许多其他扩展ActionController的插件(例如inherited_resources、resource_controller)也在做同样的事情,所以似乎是谁先加载的问题来决定它是失败还是正常工作。

    我知道我可以在调用“foo”之前将代码放入某个模块中,并手动将该模块添加到ApplicationController代码中。我宁愿不去,我喜欢“foo”的干净。

    我也不想做手册“要求”。插件应该自己自动加载:)

    2 回复  |  直到 16 年前
        1
  •  1
  •   James A. Rosen    17 年前

    你遇到的是一个经典的插件加载顺序问题。Ryan Daigle有一个 nice article

    # in RAILS_ROOT/config/environment.rb:
    ...
    Rails::Initializer.run do |config|
      # load Bar before Foo, then everything else:
      config.plugins = [ :bar, :foo, :all ]
      ...
    end
    
        2
  •  0
  •   Swanand    17 年前

    ResourceController foo bar . rails/railties/lib/initializer.rb ).您能否提供错误的堆栈跟踪,以便调试此错误。

    module ActionController
      class Base
         class << self
           ... # Class methods here
         end
      ... # Instance methods here
      end
    end