0

皆さん、

次のようなconfig/settings.ymlファイルがあります。

lab_options: mappings_hash: {can_type: "Tumor::OncologyRun.basic_test"}

次に、私のモデルapp/models/tumor.rbで、このようなことをしたかった

def sync_tumor_test
  Settings.lab_options.mappings_hash.to_hash[:can_type](age, demographic)
end

上記のケースでは、メソッドTumor::OncologyRun.basic_testを引数agedemographicsで呼び出したいと思います。メソッド Tumor::OncologyRun.basic_test は lib/tumor/oncology_run.rb にあり、次のようになります。

    module Tumor
     module OncologyRun
      def OncologyRun.basic_test(age, demographics)
       #code here
      end
     end
   end

ruby ではメソッド名は文字列であることを知っているので、Rails コンソールからsend(Settings.lab_options.mappings_hash.to_hash[:can_type](age, demographic))のようなものを使用してこれを試しているときに、これを引数で呼び出すにはどうすればよいですか? NOMethod エラーが発生しました。フィードバックは大歓迎です。どうもありがとうございました

4

1 に答える 1

1

この場合、オブジェクト名とメソッド呼び出しの両方を単一の文字列に格納しているため、最初にそれらを分割してから、次sendのように使用する必要があります。

klass, meth = Settings.lab_options.mappings_hash.to_hash[:can_type].split('.')
klass.constantize.send(meth.to_sym, age, demographic)

上記は、 を呼び出すことと同等Tumor::OncologyRun.basic_test(age, demographic)です。このconstantize呼び出しは、オブジェクトの名前から実際の ruby​​ オブジェクトに変換するために必要です。

basic_test注 - これはが のクラス メソッドであることを前提としていOncologyRunます。インスタンス メソッドの場合は、最初に呼び出してから、結果のオブジェクトでその呼び出しをnew使用する必要があります。send

于 2013-03-11T16:13:28.147 に答える