Ruby on rails 如何在保存ActiveRecord对象之前设置其属性?
我试图理解活动记录回调,但它们不起作用,就像我想的那样 e、 g 模型 但这真的很奇怪,因为如果我删除attr_可访问行,我仍然会得到这个错误 编辑3 如果有人问,是的,我正在尝试更新现有的记录 编辑4 是的,我喜欢编辑 如果我在控制台中键入Ruby on rails 如何在保存ActiveRecord对象之前设置其属性?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我试图理解活动记录回调,但它们不起作用,就像我想的那样 e、 g 模型 但这真的很奇怪,因为如果我删除attr_可访问行,我仍然会得到这个错误 编辑3 如果有人问,是的,我正在尝试更新现有的记录 编辑4 是的,我喜欢编辑 如果我在控制台中键入 c.save => # false c.errors => #<OrderedHash {}> c.save=>false c、 错误=># 请尝试: def check_done if item1 && it
c.save => # false
c.errors => #<OrderedHash {}>
c.save=>false
c、 错误=>#
请尝试:
def check_done
if item1 && item2
done = true
else
done = false
end
end
在您的私人方法中,尝试
def check_done
self.done = (self.item1 && self.item2) ? true : false
end
回调的问题是,如果
item1
或item2
为false,它将返回false
从文件中:
如果在_validation回调之前的返回值可以计算为false
,则该过程将中止,并且Base#save
将返回false
解决办法很简单;在回调结束时返回true
,如下所示:
def check_done
self.done = (item1 && item2)
return true
end
Buhuuu,这也不起作用…但感谢您的努力:)您是否尝试在@PeterWong解决方案中添加自我引用?您的应该与我的相同…应该还有其他问题@tabaluga,item1
,item2
设置是否正确(如您所料为真或假)。列done
是否为布尔值?或者你介意添加一些调试日志,看看变量是否如你所期望的那样变化吗?@PeterWong:我编辑了上面的帖子,谢谢。ActiveRecord指出“不能批量分配这些受保护的属性”。但是如果我删除attru accessible行,问题仍然存在。是的,所有的值都是布尔类型。这里不需要三元,self.done=self.item1&&self.item2
就可以了。你为什么说这不起作用,有什么错误?您可以在yourobject.save之后调用yourobject.errors进行检查哦,好的,我得到了这个myobject.errors#怎么样myobject.errors.inspect
?这也会返回=>#谢谢,谢谢,谢谢!顺便说一句,如果你们要来柏林,给我写封信,你赢得了一杯酒:)这真是太棒了,我开始失去理智,因为我试图在回调方法的末尾打印/put/p self,并意识到这样做会返回nil,这会破坏回调。叹气!哇,谢谢!
def check_done
self.done = (self.item1 && self.item2) ? true : false
end
before_save { |record|
record.done = item1 && item2
}
def check_done
self.done = (item1 && item2)
return true
end