tab*_*uga 5 activerecord ruby-on-rails
我试图理解Active Record Callbacks,但是它们不起作用,就像我想要的那样.
例如
模型
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
Run Code Online (Sandbox Code Playgroud)
如果我在控制台中实例化一个对象并尝试保存它,这不起作用,保存操作返回"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
Run Code Online (Sandbox Code Playgroud)
但这真的很奇怪,因为如果我删除了attr_accessible线,我仍然会收到此错误...
编辑3 如果有人问,是的,我正在尝试更新现有记录.
编辑4 是的,我喜欢编辑如果我输入控制台
c.save => # false
c.errors => #<OrderedHash {}>
Run Code Online (Sandbox Code Playgroud)
与回调的问题是,它返回false如果任一item1或者item2是假的.
如果
before_validation可以评估回调的返回值false,则该过程将被中止Base#save并将返回false.
解决方案很简单; true在回调结束时返回,如下所示:
def check_done
self.done = (item1 && item2)
return true
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7779 次 |
| 最近记录: |