根据变量名称动态调用方法

时间:2018-07-16 19:01:34

标签: ruby-on-rails ruby

我有一个应用程序,可以根据用户选择的“速度”来计算运费。我试图基于这些速度来重构此if语句。这是当前的if语句:

  def walk_thru_each_rate_type(speed_hash, speed_from_db)
    if speed_hash.has_key?("flex")
      handle_flex_rates(speed_from_db)
    end
    if speed_hash.has_key?("fixed")
      handle_fixed_rates(speed_from_db)
    end
    if speed_hash.has_key?("free")
      handle_free_shipping(speed_from_db)
    end
  end

因此,每种方法仅基于“速度”。 flex, fixed or free和方法名称中具有这些速度。我在想像这样的事情,但是不起作用:

handle_"#{speed}"_rates(speed_from_db)

如何根据速度名称动态调用方法?

1 个答案:

答案 0 :(得分:2)

您可以调用Object#send传递方法名称和参数。就您而言,它就像:

self.send("handle_#{speed}_rates", speed_from_db)

看看https://apidock.com/ruby/Object/send