0

我在它自己的 gem 中放置了一些用于 rails 应用程序的共享模型。这只是模型,所以我没有使用引擎。在我添加“acts_as_list”gem 之前,设置它似乎工作正常。

# 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的 gem 文件:

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_list和方法(从 gem 目录运行)。但是由于我提到的 gem 错误,项目控制台(从项目目录运行)将无法启动。ancestrybin/consolebundle exec rails console

4

1 回答 1

0

require :acts_as_list如果在语句之前需要模型,这可能是由于加载顺序问题造成的。检查 gem 是否指定了加载顺序。如果没有,您可以尝试以下方法:

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

require "models/page"

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

puts __FILE__

在相关源文件的顶部。

于 2016-01-15T19:24:57.387 回答