2013-08-03 24 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