如何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
我觉得有点笨拙。
谢谢你的帮助!
如何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 不会在您的 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
除非您有一个名为 的方法,否则您的代码将不会运行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