2010-09-16 82 views
5

我想了解活动记录回调,但他们不工作,就像我想。如何在保存之前在ActiveRecord对象中设置属性?

例如

型号

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的”,代码工作......但属性不保存(明显)。这真是奇怪

EDIT 2奇怪...开发日志显示了这个

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 如果有人问,是的,我正在尝试更新现有的记录。

EDIT 4 是的,我喜欢编辑 如果我在控制台输入

c.save => # false 
c.errors => #<OrderedHash {}> 
+0

为什么你的意思是,这并不工作做,有什么错误?你可以通过调用yourobject.errors来检查你的whorobject.save – Mike 2010-09-16 13:57:01

+0

哦,好吧 我得到这个myobject.errors# tabaluga 2010-09-16 16:04:57

+0

'myobject.errors.inspect'怎么样? – PeterWong 2010-09-16 16:15:44

回答

8

回调的问题在于,如果item1item2为假,它将返回false

Active Record Callbacks文档:

如果before_validation回调的返回值进行评估,以false,该过程将被中止,并Base#save将返回false

该解决方案很简单;在回调的最后返回true,就像这样:

def check_done 
    self.done = (item1 && item2) 
    return true 
end 
+3

谢谢,谢谢,谢谢! BTW。所有的你,如果你要来柏林,请给我一条线,你赚了饮料:) – tabaluga 2010-09-17 11:47:23

+0

这真是太好了,我开始失去我试图在回调结束打印/看跌/ P自我的理智方法,并意识到这样做会返回零,这将炸掉回调。叹了口气! Whe谢谢! – 2013-10-03 04:58:57

0

请尝试:

def check_done 
    if item1 && item2 
    done = true 
    else 
    done = false 
    end 
end 
+0

嗯,不起作用:( ,但谢谢你的帮助:) – tabaluga 2010-09-16 10:00:54

0

在你的私有方法,尝试

def check_done 
    self.done = (self.item1 && self.item2) ? true : false 
end 
+0

Buhuuu,这也行不通...但谢谢你的努力:) – tabaluga 2010-09-16 13:52:37

+0

你尝试在@PeterWong解决方案中添加自引用? – Yannis 2010-09-16 14:49:29

+1

你应该等同于我的...应该有其他问题。 @tabaluga,'item1','item2'是否设置正确(如您所料,为true和false)。并且'done'列是布尔值吗?或者你会介意添加一些调试日志,以查看变量是否如预期的那样变化? – PeterWong 2010-09-16 15:08:00

2
before_save { |record| 
    record.done = item1 && item2 
} 
+1

谢谢,谢谢,谢谢 – tabaluga 2010-09-17 11:47:51

相关问题