1

我知道从控制器调用其他操作未被批准,但我得到的代码是使用 eval() 来做到这一点。

  if @payment.save
    eval("pay_with_#{params[:method]}")
  end 

方法参数已设置(其值为 realex)并且付款正在保存,但未调用 pay_with_realex 函数。这大概与eval()有关吗?

你会建议什么作为替代方案?

4

3 回答 3

3

你可以使用Object.send

if @payment.save
    send("pay_with_#{params[:method]}")
end 
于 2012-08-17T14:38:51.423 回答
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
于 2012-08-17T14:41:25.497 回答
0

您可以动态调用控制器中的其他方法,但由于各种原因,这不是一个好主意。您可以拥有私有控制器方法,然后根据条件调用它们,但您的代码将不是面向对象的。

但如果你必须这样做,

您可以使用 Object#send

if @payment.save
    send("pay_with_#{params[:method]}")
end 

或者你可以使用 method.call

if @payment.save
    method("pay_with_#{params[:method]}").call
end

话虽如此,最好的方法是让支付方法是模型并根据您的参数调用它们,可能使用 STI。

于 2012-08-17T16:12:17.823 回答