如何重构这个 Rails 操作



如何重构这个简单的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

这对我来说感觉有点笨拙。

感谢您的任何帮助!

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

这里有三个建议:

如果invoice_id在付款实例的实时内不会更改,并且您不需要缓存:

  def amount
    invoice.balance.abs
  end

如果invoice_id不会在付款实例的实时内发生变化,但您在控制器/视图中多次使用该金额值。(使用缓存):

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

如果invoice_id可能会在付款实例的实时内发生变化,并且您需要缓存:

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

除非你有一个名为 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

最新更新