【问题标题】:undefined method `cache_sweeper' for ActionController::Base:Class - warblerActionController::Base:Class 的未定义方法 `cache_sweeper' - 莺
【发布时间】:2011-06-28 22:07:15
【问题描述】:

我正在 glassfish 上部署我的 Jruby Rails 应用程序,并安装了 acts_as_audited 作为 gem/插件。

每当我尝试审核我的模型时,我都会收到以下错误。

我的环境是:Jruby 1.6.0.RC2,Rails 3.0.3

如果你们想了解更多关于错误http://www.ruby-forum.com/topic/1053934的信息,可以参考这里

请帮帮我,我卡在这里

Application Error
org.jruby.rack.RackInitializationException: undefined method `cache_sweeper' for ActionController::Base:Class
    from /home/dev2/glassfishv3/glassfish/domains/domain1/applications/gavel/WEB-INF/gems/gems/acts_as_audited-2.0.0.rc6/lib/acts_as_audited.rb:44:in `class_eval'
    from /home/dev2/glassfishv3/glassfish/domains/domain1/applications/gavel/WEB-INF/gems/gems/acts_as_audited-2.0.0.rc6/lib/acts_as_audited.rb:44
    from /home/dev2/glassfishv3/glassfish/domains/domain1/applications/gavel/WEB-INF/gems/gems/acts_as_audited-2.0.0.rc6/lib/acts_as_audited.rb:68:in `require'
    from /home/dev2/glassfishv3/glassfish/domains/domain1/applications/gavel/WEB-INF/gems/gems/bundler-1.0.10/lib/bundler/runtime.rb:68:in `require'
    from /home/dev2/glassfishv3/glassfish/domains/domain1/applications/gavel/WEB-INF/gems/gems/bundler-1.0.10/lib/bundler/runtime.rb:66:in `each'
    from /home/dev2/glassfishv3/glassfish/domains/domain1/applications/gavel/WEB-INF/gems/gems/bundler-1.0.10/lib/bundler/runtime.rb:66:in `require'
    from /home/dev2/glassfishv3/glassfish/domains/domain1/applications/gavel/WEB-INF/gems/gems/bundler-1.0.10/lib/bundler/runtime.rb:55:in `each'
    from /home/dev2/glassfishv3/glassfish/domains/domain1/applications/gavel/WEB-INF/gems/gems/bundler-1.0.10/lib/bundler/runtime.rb:55:in `require'
     ... 20 levels...

【问题讨论】:

    标签: glassfish jruby warbler


    【解决方案1】:

    我在 jruby-rack 中将这个问题报告为 a bug

    一种解决方法是在 config/boot.rb 中的 require 'rubygems' 之后添加 require 'active_record' if defined? $servlet_context,或者在 application.rb ActionController::Base.send(:include, ActionController::Caching::Sweeping) if defined? $servlet_context 中手动包括清扫 somwhere。

    【讨论】:

      【解决方案2】:

      我想我认识到了这个问题。看起来acts_as_audited 使用了缓存清扫器。我在使用缓存清扫器时遇到过这个问题。

      您需要在 ApplicationController 中明确包含缓存模块:

      class ApplicationController < ActionController::Base
      
        # JRuby not finding cache sweeper at runtime in production
        include ActionController::Caching::Sweeping if defined?(JRUBY_VERSION)
      
        # Rest of your class here...
      
      end
      

      我不确定为什么会发生这种情况,但这可能是与在生产的线程安全模式下运行相关的加载/解决问题。

      【讨论】:

      • 更新:从那以后我发现了以下 Rails Lighthouse 票证,表明清扫器不是线程安全的。您可能会遇到其他问题。但是,有一种解决方法。 rails.lighthouseapp.com/projects/8994/tickets/…
      • 嗨,斯科特,谢谢您的回答。我以前做过,现在也试过了,但对我没用。重复同样的错误。
      • 我什至尝试以我所知道的所有方式加载 action_controller,但我不知道我在做什么错。
      • 我刚刚意识到答案可能是什么。我刚刚在 Github 上查看了acts_as_audited 的源代码...查看引发错误的行:github.com/collectiveidea/acts_as_audited/blob/master/lib/… 看到它与我的答案修复的错误相同,但它可能比我的修复更早发生ApplicationController,因此如果您以相同的方式修补 gem 源,即在第 45 行之前放置“include ActionController::Caching::Sweeping”,它可能会起作用。这有意义吗?
      • 我什至尝试过但无法解决它。我不知道它有什么问题或我在做什么错。奇怪的是它在开发中有效,我无法在 glassfish 上部署它。我试图在生产环境中的 webrick 上运行它,并且在那里很好。我认为它因为颤音而破裂
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 2013-10-20
      • 2015-03-16
      相关资源
      最近更新 更多