Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails链接多个命令以发送带有参数的方法_Ruby On Rails - Fatal编程技术网

Ruby on rails Rails链接多个命令以发送带有参数的方法

Ruby on rails Rails链接多个命令以发送带有参数的方法,ruby-on-rails,Ruby On Rails,我试图将一系列命令链接到基于字符串的send方法。到目前为止,我有一个很好用的: "visible_tasks.count".split('.').inject(user1, :send) 这相当于: user1.send("visible_tasks").send("count") user1.send("visible_tasks").send("find", 383) 我正在努力解决的是如何修改拆分/注入,以便将参数传递给特定的发送方法。作为一个例子,我希望能够做到以下几点: use

我试图将一系列命令链接到基于字符串的send方法。到目前为止,我有一个很好用的:

"visible_tasks.count".split('.').inject(user1, :send)
这相当于:

user1.send("visible_tasks").send("count")
user1.send("visible_tasks").send("find", 383)
我正在努力解决的是如何修改拆分/注入,以便将参数传递给特定的发送方法。作为一个例子,我希望能够做到以下几点:

user1.send("visible_tasks").send("count")
user1.send("visible_tasks").send("find", 383)
我已经尝试了很多方法,包括:

"visible_tasks.find 383".split('.').inject(user1, :send)
"visible_tasks.find, 383".split('.').inject(user1, :send)
"visible_tasks.find(383)".split('.').inject(user1, :send)
但它将“.”后面的所有内容解释为一个完整的方法,而不是方法+参数

更新:我最终使用了@Leantraxxx建议的eval方法,我只在白名单方法的safe_send方法中调用过,如下所示:

def safe_send(method)
method_valid = false #initialise to false
VALID_USER_METHODS.each do |valid_user_method|
  if !/^#{valid_user_method}$/.match(method).nil? #if the method matches any of the valid_user_methods, retrn true and break the loop
    method_valid = true
    break
  end
end
raise ArgumentError, "#{method} not allowed" unless method_valid == true

eval method

结束

您可以改用
eval

eval("Doctor.last.appointments.first")
=> #<Appointment id: 75, appointment_date: "2014-06-11", patient_id: 47, doctor_id: 5, created_at: "2014-12-23 18:55:13", updated_at: "2014-12-23 18:55:13", time_slot_id: 40, video_call_token: nil, call_state: "pending", payment_state: "unpaid", session_id: nil, manual_payment_at: nil, performed_video_call: false>
eval(“医生最后一次预约第一次”)
=> #

谢谢@Leantraxxx。在这种情况下,这当然很有效。