Ruby/Rails重写save方法报错:undefined method `save' for true:TrueClass
问题原因分析与解决办法
嘿,这个问题其实很好解决,咱们先揪出代码里的问题根源:
你在OverrideSave模块的save方法里写了super.save,这就是触发NoMethodError的直接原因!
为什么会报错?
当你用prepend OverrideSave时,模块里的save方法会优先被执行。这里的super已经是直接调用Mongoid提供的原生save方法了,而原生save方法返回的是布尔值(true表示保存成功,false表示失败)。你在这个布尔值后面再加.save,就相当于给TrueClass/FalseClass的实例调用save方法——这两个类本来就没有这个方法,自然就抛出异常了。
修正后的模块代码
把super.save改成super就可以了,示例如下:
module OverrideSave def save # 在这里写你的自定义检查逻辑,比如: # if transaction_value.present? && transaction_value > 0 if some_condition_true super # 直接调用原生save方法,不需要额外加.save else # 可以在这里处理不满足条件的情况,比如返回false或者抛出验证异常 false end end end
额外优化提示
如果你需要在保存前后都做操作(比如保存前检查合法性,保存成功后记录日志),可以这样写,保证和原生save方法的行为一致:
module OverrideSave def save # 保存前的检查逻辑,不满足直接返回false return false unless some_condition_true # 调用原生save方法并拿到结果 save_result = super # 保存成功后的后续操作,比如记录日志 if save_result # 例如:puts "交易记录#{id}保存成功" end save_result # 记得返回保存结果,保持原生方法的行为 end end
这样就能让你的自定义检查逻辑正常运行,同时不会破坏Mongoid原生save方法的原有行为啦~
内容的提问来源于stack exchange,提问作者CyberMew
相关产品推荐
相关产品推荐

