Rails 3 - rails控制台与rails服务器中的不同类行为

时间:2013-08-03 17:29:19

标签: ruby ruby-on-rails-3

我在名为Plac

的模型中引用了一个自定义类

模型在models / plac.rb中定义如下:

class Model < ActiveRecord::Base

  def notify_owner

    notifier = BatchNotify.getInstance
  end


end

BatchNotify在lib / modules / batch_notify.rb中定义如下:

class BatchNotify

  def self.getInstance
    env = Rails.env
    if(env == "test")
      return TestBatchNotify.new
    else

      BatchNotify.new
    end
  end
end

我还将模块目录添加到autoload_path:

config.autoload_paths += %W(#{config.root}/lib/modules)

奇怪的是,当来自rails控制台的notify_owner()运行良好时。

但是,当我使用rails服务器启动Web服务器并尝试使用浏览器中的应用程序触发notify_owner时,我收到以下错误:

未初始化的常量Plac :: BatchNotify

首先,为什么控制台与Web服务器的行为不同?

其次,为什么它仍然无法识别批量通知常量?

顺便说一句,我也尝试在模块中定义BatchNotify并将其作为Module :: BatchNotify引用而没有运气......

1 个答案:

答案 0 :(得分:0)

有两种方法可以正确加载BatchNotify类。

使用以下代码添加config / initializers / 00_requires.rb文件:

require "#{Rails.root}/lib/modules/batch_notify.rb"

或者,需要Model类中的models / placebo.rb:

require "#{Rails.root}/lib/modules/batch_notify.rb"

关于此代码的其他几条评论:

  1. Rails已经使用了术语模型,因此Model在Rails中不是一个好的类名。
  2. 文件命名约定是文件名应与模型名称对应。因此,应将models / placebo.rb重命名为models / model.rb以遵循约定。
  3. BatchNotify是一个类,所以我认为你不应该把它作为目录名模块。