0

Rails アプリの共有モデルを独自の gem に入れています。あくまで模型なのでエンジンは使っていません。「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この場合、モデルが宝石の中にあるため、メソッドにアクセスするために何か特別なことをしなければなりませんか?

更新: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 のコンソール ( gem ディレクトリから実行)acts_as_listでメソッドを使用できます。しかし、前述の 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 に答える