2013-08-03 104 views
0

我从/ plac.rb命名的Plac的Rails 3 - 不同类的行为在轨控制台VS轨服务器

模型在模型中定义的模型,这样中引用的自定义类:

class Model < ActiveRecord::Base 

    def notify_owner 

    notifier = BatchNotify.getInstance 
    end 


end 

BatchNotify在LIB /模块/ 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) 

奇怪的是,当notify_owner()在rails控制台上工作良好时。

然而,当我开始使用Rails服务器的Web服务器,并尝试通过在浏览器中使用的应用程序触发notify_owner,我得到以下错误:

未初始化的常量的Plac :: BatchNotify

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

二,为什么它仍然不能识别批量通知常量?

顺便说一句,我也试着在一个模块内定义BatchNotify并没有运气引用它作为模块:: BatchNotify ...

+0

永远不要依赖于Rails的自动加载功能。始终要求你的依赖。在模型中添加**需要'modules/batch_notify'**。 **导轨控制台制作**应该有类似的问题。 – 2013-08-03 17:50:31

+0

已经有一个很好的答案。但作为附加提示..如果您编写:: BatchNotify而不是BatchNotify,rails将搜索模型类作用域之外的常量。 – Mattherick

+0

Mattherick我试过了。我得到这个错误:未初始化的常量BatchNotify –

回答

0

有一对夫妇的方式来获得正确加载的BatchNotify类。

添加配置/初始化/ 00_requires.rb文件用下面的代码:

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

或者,需要模特/ placebo.rb在Model类:

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

一对夫妇的其他对此代码的评论如下:

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

权力感谢您的答案。只是供参考我没有使用模型作为我的模型的名称,我只是在发布之前尝试重新命名模型。我重命名模型以保护我们的代码。模块只是真正意义上的模块文件夹的名称,意味着可以独立使用的一小段代码。不是红宝石模块。我完全理解模块和课程的区别。如果我在plac.rb中声明了BatchNotify,代码就可以工作。无论我做什么,都需要代码甚至不起作用。也许升级到轨道4可能会有所帮助..? –

+0

@PMoses - 升级到Rails 4应该与此无关。当您需要该文件时,添加一个puts语句并查看是否返回true或false。另外,尝试在Rails控制台中运行'puts require“#{Rails.root} /lib/modules/batch_notify.rb”'并查看返回的内容。我唯一剩下的猜测是什么出了问题,是因为你使用了错误的路径名,或者使用目录名模块来搞乱Rails。 – Powers