Ruby中的动态方法调用

时间:2014-11-06 13:43:31

标签: ruby-on-rails ruby

我正按照以下

从表单传递参数
area => "Time logs"
user_id => "21"

area => "Expense management"
user_id => "21"

此参数用于确定要从系统中清除的用户数据区域。

然后我的控制器中有什么

area = params[:area]
user = User.find(params[:user_id])

case area
when "Time logs"
  user.purge_time_log_data
when "Expense management"
  user.purge_expense_data
end

因此,用户从表单中提供区域和员工,然后通过调用模型上的方法清除该区域的数据。然而,实际上我实际上可能有十个方面,而且我不想在控制器中有大量列表。我不能使参数与方法名称匹配,但有没有办法可以做一些事情,比如创建一个哈希来翻译区域,比如

area_hash = {"Expense management" => "expense_data", "Time logs" => "time_log_data"}

然后动态调用用户模型上的方法,所以我最终在控制器中输入了1行。我猜,但是像

employee.send("purge"+area_hash[area])

????

1 个答案:

答案 0 :(得分:4)

你很近:

employee.send("purge_#{area_hash[area]}")

你应该考虑使用public_send来避免在没有意识到的情况下调用私有方法:

employee.public_send("purge_#{area_hash[area]}")

发送使用符号,以便您可以这样做:

area_hash = {"Expense management" => :purge_expense_data, "Time logs" => :purge_time_log_data}
employee.public_send(area_hash[area])