【问题标题】:Rails: Using Eval to call another actionRails:使用 Eval 调用另一个动作
【发布时间】:2012-08-14 00:29:58
【问题描述】:

我知道从控制器调用其他操作未获批准,但我的代码正在使用 eval() 来执行此操作。

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

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

您会建议什么替代方案?

【问题讨论】:

  • 这是一种错误的尝试方式。只需创建一个私有函数并从两个操作中调用它。除非您是 ruby​​ 元向导,否则请避免使用 eval。
  • 是的,这就是我的感受,所以我需要另一种方式

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


【解决方案1】:

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

但如果你必须这样做,

你可以使用 Object#send

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

或者你可以使用method.call

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

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

【讨论】:

    【解决方案2】:

    在不了解您的控制器的情况下,我最初的想法是将“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
    

    【讨论】:

      【解决方案3】:

      你可以使用Object.send

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多