回归保存!带有 DRY 的代码后的值
Posted
技术标签:
【中文标题】回归保存!带有 DRY 的代码后的值【英文标题】:Returning save! value after code with DRY 【发布时间】:2015-04-27 18:40:41 【问题描述】:您好,我正在尝试编写功能等同于的代码:
def model_method(args)
...
obj.save!
... void code assuming save! worked ...
return obj.save!
end
通常我会使用 after_save 回调,但是有一些参数传递到这个模型的方法中,我需要将这些参数用于...code...
snipit。
关于如何利用 DRY 做到这一点的任何想法?
我希望像obj.save!.tap ...
这样的东西可以工作,但不幸的是没有。
【问题讨论】:
你到底想做什么? 对不起,我想我忘了包括这是一个模型方法。在执行一些否则会返回nil
的代码之后,我试图保留obj.save!
的真实返回值。然后我通常会执行 after_save 回调,但是我将无法访问传入的 args
。最终我只想返回 obj.save!
而不必写两次。
【参考方案1】:
save!
方法将返回 true 或引发异常,因此您可以放心地这样做:
def model_method(args)
#...
obj.save!
#... void code assuming save! worked ...
true
end
但这几乎肯定是错误的。您能否更新您的问题,以便清楚您实际想要实现的目标是什么?
编辑:
更通用的解决方案:
def model_method(args)
#...
if result = obj.save!
#... void code assuming save! worked ...
end
result
end
【讨论】:
好吧,更具体地说,我们在保存后调用了一个自定义回调!方法。它看起来类似于obj.save! <newline> invoke_callback(:callback_method_name, args) <newline> return obj.save!
抱歉,我不知道如何在没有新行的情况下不让它看起来很丑。
您是否希望每次保存模型时都执行此回调。使用after_save
方法。
但是在这种情况下,我不能保留传入的args
对吗?这样,我可以手动设置传入invoke_callback(...)
的参数以上是关于回归保存!带有 DRY 的代码后的值的主要内容,如果未能解决你的问题,请参考以下文章