如何重构这个简单的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对我来说,这感觉有点笨拙。
谢谢你的帮助!
发布于 2012-10-11 07:07:41
为了简化控制器,您应该将业务逻辑移动到您的模型中。
这里有三个建议:
如果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发布于 2012-10-11 09:19:55
除非你有一个名为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"
endhttps://stackoverflow.com/questions/12829445
复制相似问题