2012-11-12 120 views
3

我用模型創建了一個Gem(實際上,從主項目中提取它)以在我們平臺中的項目之間共享。寶石與模型

我們有幾十種型號,所以不是要求他們一個接一個,我寫了下面的代碼:

Gem.find_files("my_gem/models/*.rb").each { |path| require path } 

我訪問具有my_gem在創業板上市的文件並運行rails c我得到的項目之一下面的輸出:

/Users/myuser/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.8/lib/active_record/dynamic_matchers.rb:50:in `method_missing': undefined method `has_attached_file' for #<Class:0x007fad4b93ccb8> (NoMethodError) 

我的一個模型是用寶石回形針,是什麼奇怪的是:

  1. 如果我刪除了使用回形針require "my_gem/models/paperclip_model"上述聲明加載所有的車型 自動,rails c運行正常
  2. 如果我嘗試包括onlye模型行我收到了同樣的錯誤

於是我改變我的寶石不加載任何模型,並且當我嘗試引用來自Rails控制檯的任何模型時,它說該類未加載,但後來我運行Gem.find_files("my_gem/models/*.rb").each { |path| require path }require "my_gem/models/paperclip_model"'它們完美地工作,我可以使用該模型。

有沒有人見過同樣的問題?

+0

在Rails代碼中,你調用了'Gem.find_files(「my_gem/models/*。rb」)。需要路徑}'從? –

回答

3

似乎改變requireautoload解決

我改變Gem.find_files("my_gem/models/*.rb").each { |path| require path }

問題

for

Gem.find_files("my_gem/models/*.rb").each do |f| 
    filename = File.basename(f, '.*') 
    class_name_symbol = filename.classify.to_sym 
    autoload class_name_symbol, "my_gem/models/#{filename}" 
end 

現在它工作G。

+0

謝謝你分享這個,幫了我很多:)奇怪的是,需要沒有工作雖然 – Richlewis

0

聽起來像你的寶石中的一個模型取決於Paperclip,但你沒有明確地將它設置爲依賴。所以發生的是,如果你的模型在之前加載回形針,你會看到has_attached_fileUndefinedMethod錯誤。

如果您使用的模型,其中有回形針作爲依賴Rails應用程序,你控制檯(或服務器)後加載這些模型已經脫離了,回形針會存在,所以你不會看到這個錯誤。

的解決方案是明確添加回形針作爲依賴於你的gemspec,是這樣的:

s.add_dependency('paperclip') 

假設這種寶石總是會在Rails應用程序的上下文中使用,這應該工作。如果沒有,你可能還需要下面的行添加到您的模型使用紙夾的頂部:

require "paperclip" 
+0

我忘了提,但我已經在做。 –