1

この単純なアクションをどのnewようにリファクタリングできますか?

def new
  @payment = Payment.new(:invoice_id => params[:invoice_id])
  if @payment.invoice.present?    
    @payment.amount = @payment.invoice.balance.abs
  end
  @title = "New payment"
end

私には少しぎこちなく感じます。

助けてくれてありがとう!

4

2 に答える 2

2

というメソッドがない限り、コードは実行されませんがparams、それがあると仮定します。

def new
  @payment = Payment.new(:invoice_id => params[:invoice_id])
  .tap{|pay| pay.invoice.tap{|inv| pay.amount = inv.balance.abs if inv.present?}}
  @title = "New payment"
end
于 2012-10-11T01:19:54.640 に答える
2

コントローラーを単純化するには、ビジネス ロジックをモデルに移動する必要があります。

次の 3 つの提案があります。

Invoice_id が Payment インスタンスのライブ中に変更されず、キャッシュが必要ない場合:

  def amount
    invoice.balance.abs
  end

Invoice_id は Payment インスタンスのライブ中に変更されませんが、コントローラー/ビューで金額の値を複数回使用する場合。(キャッシュを使用):

  def amount
    @_amount ||= invoice.balance.abs
  end

Invoice_id が Payment インスタンスのライブ中に変更される可能性があり、キャッシュが必要な場合:

  def amount
    @_amount ||= {}
    @_amount[invoice_id] ||= invoice.balance.abs
  end

end
于 2012-10-10T23:07:40.610 に答える