我知道调用控制器中的其他操作是不被批准的,但我得到的代码正在使用eval()来完成。
if @payment.save
eval("pay_with_#{params[:method]}")
end
设置方法参数(其值为realex)并且付款正在保存,但未调用pay_with_realex函数。这可能与eval()??
有关你会建议什么作为替代方案?
答案 0 :(得分:3)
您可以使用Object.send
if @payment.save
send("pay_with_#{params[:method]}")
end
答案 1 :(得分:0)
在不了解您的控制器的情况下,我最初的想法是将“pay_with_”方法转移到您的@payment类中,并将其子类化以处理不同的付款方式。
class Payment < ActiveRecord::Base
end
class PaymentRealEx < Payment
def pay
# your way of doing payment
end
end
class PaymentController
def create
case params[:method]
when "realex"
@payment = PaymentReadEx.new
end
if @payment.save
@payment.pay
end
end
end
答案 2 :(得分:0)
您可以动态调用控制器中的其他方法,但由于各种原因,这不是一个好主意。您可以拥有私有控制器方法,然后根据条件调用它们,但那时您的代码将不是面向对象的。
但如果你必须这样做,
您可以使用Object#send
if @payment.save
send("pay_with_#{params[:method]}")
end
或者您可以使用method.call
if @payment.save
method("pay_with_#{params[:method]}").call
end
说完这个,最好的方法是让pay方法是模型并根据你的参数调用它们,可能是使用STI。