Ruby gem依赖加载

时间:2016-01-15 17:26:22

标签: ruby rubygems acts-as-list

我将一些共享模型放在其内部的rails应用程序中。它只是模型,所以我没有使用引擎。设置好似乎工作正常,直到我添加" acts_as_list"宝石。

# gem - domain.gemspec
spec.add_dependency "acts_as_list"

# gem - lib/domain.rb
require "acts_as_list"

# gem - lib/domain/models/page.rb
acts_as_list scope: [:ancestry]

这在我的gem的控制台中工作正常,我可以像往常一样运行特定于acts_as_list的方法。但是,当我将我的gem添加到另一个项目时,它会给我一个错误。

# project - Gemfile
gem "www_domain", path: "../www_domain"

Bundler::GemRequireError: There was an error while trying to load the gem 'domain'.
NoMethodError: undefined method `acts_as_list' for #<Class:0x0055da70121ab0>
/home/shaun/sites/demo/domain/lib/domain/models/page.rb:32:in `<class:Page>'

在这种情况下我是否需要做一些特殊的事情来访问acts_as_list方法,因为我的模型位于gem中?

更新:以下是我的宝石的完整lib/domain.rb文件:

require "yaml"
require "active_record"
require "acts_as_list"
require "ancestry"

# rbfiles = File.join(File.dirname(__FILE__), "lib", "**", "*.rb")
# Dir.glob(rbfiles).each do |file|
#   require file.gsub("lib/", "")
# end

module Domain
  # Your code goes here...
  def self.root
    File.dirname(__dir__)
  end

  def self.db_config
    YAML.load_file("#{Domain.root}/db/config.yml")["development"]
  end
end

require "domain/version"
require "domain/models/page"
require "domain/models/menu"
require "domain/models/article"
require "domain/models/page_part"

我可以在gem的控制台中使用acts_as_listancestry方法(从gem目录运行bin/console)。但是由于我提到的gem错误,项目控制台(从项目目录运行bundle exec rails console)将无法启动。

1 个答案:

答案 0 :(得分:0)

如果在require :acts_as_list语句之前需要模型,则可能是由于加载顺序问题导致的。检查gem是否指定了加载顺序。如果没有,你可以尝试类似的东西:

# gem - lib/domain.rb
require "acts_as_list"

require "models/page"

如果加载顺序不清楚,我发现只需添加

就很有帮助
puts __FILE__

位于相关源文件的顶部。