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

为了简化您的控制器,您应该将业务逻辑移动到您的模型中。

这里有三个建议:

如果 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 回答
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 回答