我知道从控制器调用其他操作未被批准,但我得到的代码是使用 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。