【问题标题】:Plugin not reloading in development mode插件未在开发模式下重新加载
【发布时间】:2011-08-16 01:46:31
【问题描述】:

我写的插件有一个奇怪的问题。奇怪的是,我还有另一个插件可以打开各种 ActiveRecord 类,并且自动重新加载没有问题。

在我的插件 init.rb 文件中

User.class_eval do
  has_one :reputation
  include Karma 
  alias :rep :reputation
end

如果我在生产模式或 Rails 控制台中运行它,则没有问题。当我在开发中运行它时,它会加载一次,但除非我重新启动服务器,否则永远不会再次加载。

我在我正在使用的其他插件(acts_as_readable)中找不到任何特别之处,它以相同的方式打开用户。


编辑:

我做到了:

ActiveRecord::Base.class_eval do
  class << self
    def has_karma_values
      has_one :reputation
      alias :rep :reputation
    end
  end
end

在插件的init.rb文件中并做了

class User < ActiveRecord::Base
...
has_karma_values
...
end

并且得到关于 has_karma_values 不存在的相同错误。此时插件尚未加载。

令人困惑的是,作为可读的行为与

完全没有问题
User.class_eval do
  has_many :readings
end

ActiveRecord::Base.send :include, ActiveRecord::Acts::Readable

但我的却是。

这是我完整的 init.rb 文件

require 'reputation'
require 'karma_name'
require 'karma_tag'
require 'karma_title'
require 'acts_as_karmable'
require 'karma'
require File.expand_path('../lib/generators/karma_generator', __FILE__)

KarmaTitle.setup 'Default'

ActiveRecord::Base.class_eval do
  class << self
    def has_karma_values
      has_one :reputation
      alias :rep :reputation
    end
  end
end

ActiveRecord::Base.send :include, ActiveRecord::Acts::Karmable

这里是错误/home/david/apps/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/base.rb:1014:inmethod_missing':未定义的局部变量或方法has_karma_values' for #&lt;Class:0x9ad1b24&gt; (NameError)

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-plugins


    【解决方案1】:

    这应该可行:

    # plugin init.rb
    Rails.configuration.to_prepare do
      User.class_eval do
        has_one :reputation
        include Karma 
        alias :rep :reputation
      end
    end
    

    【讨论】:

    • 看来问题已经解决了,谢谢。这会导致生产中的冗余负载吗?我仍然很想知道为什么acts_as_readable 不需要这个小技巧。非常奇怪的不一致。
    • #to_prepare 在每个请求/响应周期开始时在开发中调用,并且在生产中仅在初始化后立即调用一次。
    【解决方案2】:

    初始化文件加载一次,你不应该从你的插件访问你的模型,它应该是相反的,你的初始化文件应该是这样的:

    ActiveRecord::Base.class_eval do
      class << self 
        def acts_as_readable
          has_one :reputation
          include Karma
          alias :rep :reputation
        end
      end
    end
    

    在你的 user.rb 文件中你应该这样做:

    class User < ActiveRecord::Base
      acts_as_readable
    end
    

    这应该会为您提供您期望的功能。

    【讨论】:

    • 感谢您的回复。我无法让它工作,它有和以前一样的错误。我在 OP 中添加了详细信息作为编辑。
    • 感谢您以另一种方式看待问题。
    猜你喜欢
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2013-04-18
    • 1970-01-01
    • 2011-08-02
    • 2012-02-05
    相关资源
    最近更新 更多