gpt4 book ai didi

ruby-on-rails - 保存之前,如何在ActiveRecord对象中设置属性?

转载 作者:行者123 更新时间:2023-12-03 16:06:09 25 4
gpt4 key购买 nike

我正在尝试了解Active Record回调,但是它们不起作用,就像我想要的那样。

例如

模型

Checklist<ActiveRecord...
attr_accessible :item1, :item2, :done # they are all boolean

before_save :check_done

private
def check_done
if item1 && item2
write_attribute :done, true
else
write_attribute :done, false
end
end

如果我在控制台中实例化一个对象并尝试保存它,则此方法不起作用,保存操作将返回“false” :(

此代码有什么问题?
提前致谢 :)

编辑:似乎“before_save”调用有问题,如果我使用“after_save”,则代码可以正常工作...但是该属性未保存(显然)。真的很奇怪

编辑2 Wierd ...开发日志显示了这一点
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
[0m
[1m[35mChecklist Load (0.2ms)[0m SELECT "checklists".* FROM "checklists" ORDER BY checklists.id DESC LIMIT 1
WARNING: Can't mass-assign protected attributes: id

但这确实很奇怪,因为如果我删除attr_accessible行,我仍然会收到此错误...

编辑3
如果有人问,是的,我正在尝试更新 现有记录。

编辑4
是的,我喜欢编辑
如果我在控制台中输入
c.save => # false
c.errors => #<OrderedHash {}>

最佳答案

回调的问题是,如果falseitem1为false,则它将返回item2

Active Record Callbacks文档中:

If the returning value of a before_validation callback can be evaluated to false, the process will be aborted and Base#save will return false.



解决方案很简单;在回调的末尾返回 true,如下所示:
def check_done
self.done = (item1 && item2)
return true
end

关于ruby-on-rails - 保存之前,如何在ActiveRecord对象中设置属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3725420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com