rails从string获取方法名称,然后传递参数

时间:2013-03-11 16:06:40

标签: ruby-on-rails

民间,

我有一个 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 。 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控制台尝试使用发送(Settings.lab_options.mappings_hash.to_hash [:can_type]之类的东西时,如何用参数调用它(年龄,人口统计))我得到 NOMethod错误任何反馈都非常感谢,非常感谢

1 个答案:

答案 0 :(得分: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_testOncologyRun上的类方法。如果它是实例方法,则需要先调用new,然后对结果对象使用send调用。