插件在开发模式下不重新加载

3
我在自己编写的插件中遇到了一个奇怪的问题。奇怪之处在于我有另外一个插件,在其中打开各种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不存在的错误。这个插件在这一步还没有被加载。

让人困惑的是,acts-as-readable插件完全没有问题。

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:in
method_missing': 未定义局部变量或方法 has_karma_values' for #<Class:0x9ad1b24> (NameError)

2个回答

4
这应该可以工作:
# 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不需要这个小技巧。非常奇怪的不一致性。 - david
在开发中,每个请求/响应周期的开始都会调用#to_prepare,而在生产环境中仅在初始化后立即调用一次。 - yfeldblum

3
初始化文件只加载一次,您不应该从插件中访问模型,应该反过来。您的初始化文件应该是这样的:
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

这应该能给您所期望的功能。


感谢您的回复。我无法使其正常工作,它仍然存在之前的错误。我已经在原始帖子中添加了详细信息。 - david
谢谢你让我以另一种方式看待这个问题。 - david

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接