2014-10-30 67 views
1

我製作腳本來嘗試一些功能。但是我不能在lib中使用模型。有趣的是,我已經有一個lib,並且它在大多數相同的代碼(?)下工作正常。無法從Rails中的/ lib訪問模型

// script/tags.rb: 
require File.expand_path('../../config/application', __FILE__) 
require 'company_tags' 

host = ARGV[0] || 'team1.crm.tld' 

c = CompanyTags.new(host) 
c.run 

// lib/company_tags.rb 
class CompanyTags 
    def initialize(host) 
    @site = Site.where(host: host).first 
    end 

    def run 
    comp = @site.companies.first 
    comp.tag_list.add("tag1") 
    comp.general_list.add("tag_general") 
    comp.save! 
    p comp.tag_list 
    end 
end 

錯誤:/lib/company_tags.rb:3:in`初始化「:未初始化不斷CompanyTags ::網站(NameError)

回答

3

您需要需要環境,而不是應用程序。

require File.expand_path('../../config/environment', __FILE__) 
require 'company_tags' 

環境將加載所有的依賴項,包括應用程序,它將引導應用程序。

+0

哇,謝謝,它工作得很好但是,你可以解釋一下,爲什麼相同的代碼爲另一對腳本+ lib工作?在那裏我使用了應用程序。 – TheVic 2014-10-30 18:27:33

+1

它可能已經工作了beca使用它以不同的方式加載,例如通過控制檯。或者因爲您沒有使用環境中定義的模型。 – 2014-10-30 19:36:43

1

只是一個想法,但嘗試改變Site.where(host: host).first::Site.where(host: host).first。將::放在前面會導致ruby在全局名稱空間中查找Site,而不是在CompanyTags中定義的常量。

+0

不可以。同樣的錯誤。 (( – TheVic 2014-10-30 17:44:39

+0

哦,對不起,錯誤不同:在'初始化':未初始化的常量Site(NameError) – TheVic 2014-10-30 17:45:20

+1

好吧,酷 - 至少排除它是一個不斷查找問題 – jerhinesmith 2014-10-30 17:58:24

1

您可以添加一個簡單的配置config/application.rb

# Autoload lib/ folder including all subdirectories 
config.autoload_paths += Dir["#{config.root}/lib/**/"] 

入住這question出更多的細節。

+0

我認爲你不是對的,我從控制檯運行它。 – TheVic 2014-10-30 17:50:33

+1

其實'rails console'或'rails c'命令加載你所有的應用程序文件,包括gems。 – mohameddiaa27 2014-10-30 17:54:17

+0

呵呵。我是指終端。一個腳本,如下所示:ruby script/tags.rb 但無論如何,我會嘗試它 – TheVic 2014-10-30 17:56:40

1

在我以前的回答中,我以爲你在運行rails控制檯。您的主要問題是不需要Site類。這是如何要求文件到你的類的工作。

通過require_all功能

require_all(MY_CLASSES_DIRECTORY)

或手動要求每個等級:

require 'Class_NAME.rb'

注意,Site類不被任何要求。

有關更多詳細信息,請檢查此link

相關問題