3

我创建了一个带有模型的 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)

我的一个模型是使用宝石回形针,奇怪的是:

  1. 如果我删除上面声明的行以自动加载所有模型,rails c 运行良好
  2. 如果我尝试仅包含使用回形针的模型,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"'它们完美地工作并且我能够使用模型.

你们中有人见过同样的问题吗?

4

2 回答 2

3

似乎改变requireautoload解决了问题

我变了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

现在它正在工作。

于 2012-11-13T11:15:03.147 回答
0

听起来您的 gem 中的模型之一依赖于 Paperclip,但您没有明确将其设置为依赖项。所以发生的情况是,如果您的模型在回形针加载之前加载,您将看到.UndefinedMethodhas_attached_file

如果您在具有回形针作为依赖项的 Rails 应用程序中使用模型,并且在控制台(或服务器)启动加载这些模型,回形针将出现,因此您不会看到此错误。

解决方案是在 gemspec 中显式添加回形针作为依赖项,例如:

s.add_dependency('paperclip') 

假设这个 gem 将始终在 Rails 应用程序的上下文中使用,这应该可以工作。如果没有,您可能还需要将以下行添加到使用回形针的模型的顶部:

require "paperclip"
于 2012-11-12T18:55:04.393 回答