2017-01-20 12 views
2

他の人のコードで作業しており、次のクラス階層を持つRailsアプリケーションでHTTPartyサービスを使用しています。親クラスと異なる署名を持つサブクラス#initializeに注意してください。私は、「初期化されていません」のメッセージについてのドキュメントを見つけることができませんRuby:初期化されていない未定義のメソッド

A::PublicUser.new(limit: 1).some_method 
undefined method `some_method' for #<A::PublicUser not initialized> 

module A 
    class Base 
    include HTTParty 
    ... 
    end 
end 

module A 
    class User < Base 

    def initialize(user) 
     @user = user 
    end 
    end 
end 

module A 
    class PublicUser < User 

    def initialize(opts = {}) 
     @limit = opts[:limit] 
     # no call to super 
    end 
    end 
end 

は、ローカルで次の結果がこれでは問題ありませんが、SemaphoreCIインチこのような失敗の原因は何ですか?

+0

これは普通のルビーですか、それともレールですか? – mudasobwa

+0

エラーの原因となったクラスは、すべて普通のルビです。しかし、Railsアプリケーションで呼び出されています。 – steel

+0

明示的にすべてのファイルが必要ですか? – mudasobwa

答えて

2

OK、取得しました。あなたの質問にというタグを付けました。なぜなら、普通の良いルビーはあまり奇妙な動作をすることはまれだからです。

多かれ少なかれ無関係に2つの異なる問題が発生しました。

  1. #<A::PublicUser not initialized>A::PublicUserinspectを呼び出す(原文のまま!)の結果です。したがって、rubyはエラーメッセージをフォーマットしようとします。そして、クラスはそのように出力されます。

  2. Railsは、あなたと一緒に、そして一定の検索をしています。 A::Baseの名前がActiveRecord::Baseと矛盾し、class User < Baseが満たされたときに何が解決されたかを推測してください。この動作を複製するには、コンソールを開いてclass Q < ActiveRecord::Base; end; Q.allocateを実行すると、#<Q not initialized>になります。 (私がそうであるように、あなたがすでにRailsのが好きですか?)

  3. は、この問題を解決する、明示的class User < A::Baseを指定するか、またはMyBaseBaseの名前を変更します。申し訳ありません。

+0

これは私のコードで何が起こっているかを示していますが、もっと一般的に何が起こっているのかまだ分かりません。多分あなたの最初のポイントはそれをカバーしています。 '.new'への呼び出しが失敗し、' inspect'が呼び出されました...何ですか? – steel

+0

'new'への呼び出しは失敗しなかったと思います。むしろ' ActiveRecord :: Base'クラスのサブクラスを作成しました。これは 'some_method'メソッドを欠いています。 – mudasobwa

+0

Hm。 "初期化されていません"とは、初期化オブジェクトのキーではないメソッドを呼び出すとActiveRecordエラーが発生することです。 (または何か) – steel

関連する問題