2012-11-12 89 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

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