update_attributes()是出错

update_attributes()是出错

按照depot里写的user模型类,输入password后会自动生成hashed_password。

我的users表里还有其它的字段:address, email。

我在controller里用update_attributes()方法更新address和email这2个字段,代码如下:

[Copy to clipboard] [ - ]
update_attributes需要后面那个“!”吗?
好像没有 update_attributes! 这个方法吧!

user.update_attributes(:address => "abc", :email => "abc@hot.com")
update_attributes!会被转换成save!

如果不加update_attributes!,数据是不会更新的,也不会抱错,加了"!"就显示错在哪了
难道我们的版本不同,我使用的时候确实没有“update_attributes!”这个方法呢!为什么呢?

[Copy to clipboard] [ - ]
最近真的是懒得想这个问题,今天突然有心情了,仔细地琢磨了一下,问题解决了。

在更新时,不用update_attributes()或save()。而是用update_attribute(),逐个更新。

Ex:
@user = User.find(1)
if request.post?
@user.update_attribute(:name, "kelly")
@user.update_attribute(:group, 0)
end

这样写,就不会报错,password can't be blank了
引用:
原帖由 bob21 于 2008-4-6 02:10 发表
最近真的是懒得想这个问题,今天突然有心情了,仔细地琢磨了一下,问题解决了。

在更新时,不用update_attributes()或save()。而是用update_attribute(),逐个更新。

Ex:
@user = User.find(1)
if request.p ...
在表里存的是hashed_password,但是这数据是由用户填入password后由model自动创建的,所以一更新其它的数据,model就会运行那个创建hashed_password方法。

但是我也不是很明白为什么单个的更新就没事,更新2个以上就会有问题
注释
# Updates all the attributes from the passed-in Hash and saves the record. If the object is invalid, the saving will
# fail and false will be returned.

代码
self.attributes = attributes
save

保存的是self.attributes就是我们传进去的hash, 所以貌似这儿要更新就要写上所有的字段.
------------------------------------------------

而update_attribute 只改一个字段其它的是不变的.
send(name.to_s + '=', value)
save
------------------------------------------------

所以我想可行的办法是取属性hash, 改动几个属性, 再传回去用update_attributes()更新

参考
http://qiezi.javaeye.com/blog/26630

user.update_attributes!(user[:address] => "abc", user[:email] => "abc@hot.com")
这样试试。
有些道理,但还是有些疑惑

等我研究研究