我知道从控制器调用其他操作未被批准,但我得到的代码是使用 eval() 来做到这一点。
if @payment.save
eval("pay_with_#{params[:method]}")
end
方法参数已设置(其值为 realex)并且付款正在保存,但未调用 pay_with_realex 函数。这大概与eval()有关吗?
你会建议什么作为替代方案?
我知道从控制器调用其他操作未被批准,但我得到的代码是使用 eval() 来做到这一点。
if @payment.save
eval("pay_with_#{params[:method]}")
end
方法参数已设置(其值为 realex)并且付款正在保存,但未调用 pay_with_realex 函数。这大概与eval()有关吗?
你会建议什么作为替代方案?
你可以使用Object.send
if @payment.save
send("pay_with_#{params[:method]}")
end
在不了解您的控制器的情况下,我最初的想法是将“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
您可以动态调用控制器中的其他方法,但由于各种原因,这不是一个好主意。您可以拥有私有控制器方法,然后根据条件调用它们,但您的代码将不是面向对象的。
但如果你必须这样做,
您可以使用 Object#send
if @payment.save
send("pay_with_#{params[:method]}")
end
或者你可以使用 method.call
if @payment.save
method("pay_with_#{params[:method]}").call
end
话虽如此,最好的方法是让支付方法是模型并根据您的参数调用它们,可能使用 STI。