我正在编写一个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中的有效参数?
答案 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
方法返回 false
或save
。因此,如果对象无效,您将获得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