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