我创建了一个带有模型的Gem(实际上是从主项目中提取出来的),以便在我们平台上的项目中进行分享。
我们有几十个模型,所以我不是一个一个地要求它们,而是编写了以下代码:
Gem.find_files("my_gem/models/*.rb").each { |path| require path }
我访问gem文件中有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)
我的一个模特是使用宝石回形针,奇怪的是:
rails c
运行良好require
"my_gem/models/paperclip_model"
的模型,则会收到相同的错误然后我将我的gem更改为不加载任何模型,当我尝试从rails控制台引用任何模型时,它表示该类未加载,但随后我运行Gem.find_files("my_gem/models/*.rb").each { |path| require path }
或require "my_gem/models/paperclip_model"
“他们工作得很好,我能够使用模型。
你们有没有看到同样的问题?
答案 0 :(得分:3)
似乎更改require
autoload
解决了问题
我更改了Gem.find_files("my_gem/models/*.rb").each { |path| require path }
的
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
现在它正在运作。
答案 1 :(得分:0)
听起来你宝石中的一个模型取决于Paperclip,但你没有明确地将它设置为依赖。所以发生的事情是,如果你的模型在回形针加载之前加载,你会看到UndefinedMethod
的{{1}}错误。
如果您在使用回形针作为依赖项的Rails应用程序中使用模型,并且在控制台(或服务器)启动后加载那些模型,则会出现Paperclip,因此您赢了看不出这个错误。
解决方案是在您的gemspec中明确添加paperclip作为依赖项,例如:
has_attached_file
假设此gem将始终在Rails应用程序的上下文中使用,这应该可行。如果没有,您可能还需要将以下行添加到使用回形针的模型顶部:
s.add_dependency('paperclip')