宝石与模型

时间:2012-11-12 18:42:47

标签: ruby-on-rails-3 gem paperclip

我创建了一个带有模型的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"的模型,则会收到相同的错误
  3. 然后我将我的gem更改为不加载任何模型,当我尝试从rails控制台引用任何模型时,它表示该类未加载,但随后我运行Gem.find_files("my_gem/models/*.rb").each { |path| require path }require "my_gem/models/paperclip_model" “他们工作得很好,我能够使用模型。

    你们有没有看到同样的问题?

2 个答案:

答案 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')