我正在尝试将一系列命令链接到基于字符串的send方法。到目前为止,我有这个工作正常:
"visible_tasks.count".split('.').inject(user1, :send)
相当于:
user1.send("visible_tasks").send("count")
我正在努力的是如何修改split / inject以便我可以将参数传递给特定的send方法。作为一个例子,我希望能够做到相同的:
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
端
答案 0 :(得分:0)
您可以改用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>