Rails:使用Eval调用另一个动作

时间:2012-08-17 14:34:45

标签: ruby-on-rails ruby model-view-controller controllers realex-payments-api

我知道调用控制器中的其他操作是不被批准的,但我得到的代码正在使用eval()来完成。

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

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

有关

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

3 个答案:

答案 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。