回归保存!带有 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 的代码后的值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 将裁剪后的图像保存到带有 Jcrop 的目录

如何在数据库中保存带有if条件的html代码[重复]

怎样获取编辑后的jqgrid的值

DRY准则

如何使用 DRY 渲染带有一个活动项目的菜单?

Python和R之间的线性回归系数之间的差异