1

コントローラーから他のアクションを呼び出すことは承認されていませんが、コードは eval() を使用して正確にそれを行っています。

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

method パラメーターが設定され (その値は 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

コントローラーで他のメソッドを動的に呼び出すことはできますが、さまざまな理由からお勧めできません。プライベート コントローラー メソッドを作成し、条件に基づいて呼び出すことはできますが、コードはオブジェクト指向ではありません。

しかし、これを行う必要がある場合は、

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 に答える
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 に答える