为什么@ user.update_attributes(nil)返回true?

时间:2014-11-02 02:39:24

标签: ruby-on-rails update-attributes

我正在编写一个rails应用程序,我正在试图弄清楚为什么将无效的params传递给update_attributes会返回true。

有效参数也会返回true。

例如:

@user.update_attributes(params[:user])
=> true

@user.update_attributes(params[:whatever])
=> true

另外

@user.update_attributes(false)
=> true

@user.update_attributes(nil)
=> true

一切都归于真实。为什么?我如何检查update_attributes中的有效参数?

2 个答案:

答案 0 :(得分:1)

#update_attributes将首先检查您的模型实例是否为#valid?在继续写入数据库之前。如果您的模型实例不是#valid?,那么它将返回false。要了解您的模型实例有什么问题,请查看您的模型的#errors。

如果您的验证first_name不能为空。然后它将返回false:

@user.update_attributes(first_name: nil)
=> false

@user.errors.first
=> [:first_name, "can't be blank"] 

深入理解源代码  #File activerecord / lib / active_record / base.rb,第2665行

  def update_attributes(attributes)
    self.attributes = attributes
    save
  end
true方法返回

falsesave。因此,如果对象无效,您将获得false。在质量分配例外的情况下ActiveModel::MassAssignmentSecurity::Error

请注意,Unknown Attributes被视为质量分配例外。

答案 1 :(得分:1)

update_attributes将更新传递的属性,如果没有传递任何属性,则无需更新任何内容,并且可以成功保存记录。

如果由于验证而无法保存记录,

update_attributes将返回false。但是,这并不意味着散列中的属性存在错误......它可能是在其他地方设置的字段,使记录无效。

# record has validation that email address must be valid format
@user.email = "invalid address"
@user.update_attributes(name: "Fred")
=> false # due to email error

# record has validation that email address must be valid format
@user.email = "fred@sample.com"
@user.update_attributes(name: "Fred")
=> true
如果您尝试更新未知属性,

update_attributes将引发异常

@user.update_attributes(vegetable: "carrot")
#> ActiveRecord::UnknownAttributeError: unknown attribute: vegetable