2016-12-07 12 views
3
# app/models/product.rb 
class Product < ApplicationRecord 
    def self.method1(param1) 
    # Here I want to call method2 with a parameter 
    method2(param2) 
    end 

    def method2(param2) 
    # Do something 
    end 
end 

私はコントローラからmethod1を呼び出します。私はプログラムを実行します。私はエラーを得た:ruby​​で自己メソッドから別のメソッドを呼び出す方法は?

method_missing(at line method2(param2)) 
.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0/lib/active_record/relation/batches.rb:59:in `block (2 levels) in find_each 
... 
+0

これはクラスクラスのために働くでしょう:) –

+0

「自己メソッド」とは何ですか? –

答えて

5
class Product < ApplicationRecord 
    def self.method1(param1) 
    # Here I want to call method2 with a parameter 
    method2(param2) 
    end 

    def self.method2(param2) 
    # Do something 
    end 
end 

説明:最初はクラスメソッドで、後者はインスタンスメソッドでした。クラスメソッドは受信側(それを呼び出すオブジェクト)を必要とせず、インスタンスメソッドはそれを必要とします。したがって、受信者(インスタンス化されたオブジェクト)があるかどうかわからないため、クラスメソッドからインスタンスメソッドを呼び出すことはできません。

+0

クラスメソッドは他のクラスメソッドとのやりとりに制限されています。クラスメソッドがプライベートメソッドと対話したい場合はどうなりますか?彼らはまた、私的なdef self.bla endとして宣言されるべきですか? – gates

+0

はい、プライベートself.blaはクラスメソッドであり、インスタンスメソッドではありません。しかし、クラスメソッドはオブジェクトをインスタンス化し、それが理にかなっていればインスタンスメソッドを呼び出すことがあります。 – Ursus

+0

(1)メソッド呼び出し(実際にはメッセージ送信、したがって 'send'メソッドの名前)の受信者は、メッセージを受け取るオブジェクト、つまりメソッドを所有しているオブジェクトです。 (2) "クラスメソッド"(技術的にはクラスのシングルトンクラスのインスタンスメソッドであり、Rubyには実際のクラスメソッドが全くありません)もレシーバを持っています: 'Product'クラスオブジェクトのシングルトンクラス。実際、暗黙の「自己」であっても、レシーバー上でメソッドを呼び出すことはできません。これは、Rubyの「すべてはオブジェクトです」という前提に由来しています。 –

2

method2Productオブジェクトのために定義されていないので、それは動作しません。

method2はインスタンスメソッドであり、Productクラスのインスタンスでのみ呼び出すことができます。

0

もちろん、@Ursusと@Andrey Deinekoの答えはこの問題の正しい解です。それ以外に、誰でもinstanceメソッドをclass method(though this is not actually class method in ruby)self.new.instance_methodで呼び出す方法を知りたい場合は、

関連する問題