Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在保存ActiveRecord对象之前设置其属性?_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 如何在保存ActiveRecord对象之前设置其属性?

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

我试图理解活动记录回调,但它们不起作用,就像我想的那样

e、 g

模型

但这真的很奇怪,因为如果我删除attr_可访问行,我仍然会得到这个错误

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

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

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