【问题标题】:How do I set attributes in an ActiveRecord Object before I save it?在保存之前如何在 ActiveRecord 对象中设置属性?
【发布时间】:2010-09-16 09:39:27
【问题描述】:

我正在尝试了解 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”,代码可以工作......但属性没有保存(显然)。真的很奇怪

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

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

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

【问题讨论】:

  • 你的意思是为什么这不起作用,有什么错误?您可以在 yourobject.save 之后调用 yourobject.errors 来检查
  • 哦,好的,我得到了这个 myobject.errors #
  • myobject.errors.inspect 怎么样??
  • 这也返回 => #

标签: ruby-on-rails activerecord


【解决方案1】:

您的回调的问题在于,如果 item1item2 为 false,它会返回 false

来自Active Record Callbacks 文档:

如果before_validation 回调的返回值可以计算为false,则进程将被中止,Base#save 将返回false

解决方法很简单;在回调结束时返回 true,如下所示:

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

【讨论】:

  • 谢谢,谢谢,谢谢!顺便提一句。如果你们要来柏林,请给我留言,你们赢了一杯:)
  • 这真的很棒,我开始失去理智,因为我试图在回调方法结束时打印/放置/p self,并意识到这样做会返回 nil,这会破坏回调.叹息!哇,谢谢!
【解决方案2】:
before_save { |record|
  record.done = item1 && item2
}

【讨论】:

    【解决方案3】:

    请尝试:

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

    【讨论】:

      【解决方案4】:

      在你的私有方法中,尝试

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

      【讨论】:

      • Buhuuu,这也不起作用...但感谢您的努力:)
      • 您是否尝试在@PeterWong 解决方案中添加自引用?
      • 你的应该和我的一样……应该还有其他问题。 @tabaluga,item1item2 是否设置正确(如您所料的那样正确和错误)。 done 列是布尔值吗?或者您是否介意添加一些调试日志以查看变量是否按您的预期更改?
      • @PeterWong:我在上面编辑了我的帖子,谢谢。 ActiveRecord 指出“不能批量分配这些受保护的属性”。但是,如果我删除 attr_accessible 行,问题仍然存在。是的,所有值都是布尔类型。
      • 这里不需要三元,self.done = self.item1 &amp;&amp; self.item2 就可以了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 2023-03-05
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多