1

I delegatealiasRailsデリゲートとエイリアス - 無限ループ?

class Company 
    field :name 
end 

class Employee < Professional 
    include CompanyMember 
end 

class Professional 
    include UserProfile 
end 

module CompanyMember 
    belongs_to :company 
    delegate :name, to: :company, prefix: true 
    alias :organization_name :company_name 
end 

module UserProfile 
    def to_s 
    out = "#{name} " 
    out += "(#{organization_name})" if respond_to?(:organization_name) 
    end 
    def inspect 
    to_s + super 
    end 
end 

を含む以下の無限ループを理解していない私は不足している会社とEmployeeを持っている、と私は、次の無限ループを持って

app/models/concerns/user_profile.rb:94:in `inspect' 
app/models/concerns/company_member.rb:8:in `rescue in company_name' 
app/models/concerns/company_member.rb:8:in `company_name' 
app/models/concerns/user_profile.rb:89:in `to_s' 
app/models/concerns/user_profile.rb:94:in `inspect' 
app/models/concerns/company_member.rb:8:in `rescue in company_name' 
app/models/concerns/company_member.rb:8:in `company_name' 
app/models/concerns/user_profile.rb:89:in `to_s' 

答えて

2

問題は、あなたの中にありますオーバーライドinspect不足している会社の委任された名前を呼び出そうとすると、NoMethodErrorが発生します。 Delegated method then tries to rescue it and show you helpful error message

exception = %(raise DelegationError, "#{self}##{method_prefix}#{method} delegated to #{to}.#{method}, but #{to} is nil: \#{self.inspect}") 

あなたは、inspectを呼び出して、オブジェクトの印刷可能なバージョンを取得しています。残念ながら、それは無限再帰が始まる.to_sを呼び出します。

+0

わかりました。実際には、私は実際に私のクラスの 'inspect'メソッドと' to_s'メソッドをオーバーライドして、コンソールのデバッグをはるかに簡単にすることができることを知ったが、その後、すべてのトラップに入るように見える。ガイドライン/ ? –

+0

@ CyrilDuchon-Doris:そうですね。少なくとも、 'inspect'をオーバーライドしないでください。 –

+0

@ CyrilDuchon-Doris:コンソールで簡単にデバッグするために、私は 'awesome_print'を使用します。 –