我正在尝试从管理控制器(不是用户控制器)更新用户模型的单个属性。
在这样做时,我尝试update_attribute()
了,但它也在更改用户密码。
我认为密码正在更改,因为我在用户模型上有 before_save 方法,它对密码进行哈希处理。
update_attributes()
不起作用,因为它正在检查密码的验证,即presence=>true
有什么办法可以做到这一点?
我正在尝试从管理控制器(不是用户控制器)更新用户模型的单个属性。
在这样做时,我尝试update_attribute()
了,但它也在更改用户密码。
我认为密码正在更改,因为我在用户模型上有 before_save 方法,它对密码进行哈希处理。
update_attributes()
不起作用,因为它正在检查密码的验证,即presence=>true
有什么办法可以做到这一点?
您可以使用该:if
选项设置验证条件。在我的代码中,它看起来像这样:
validates :password,
:length => { :minimum => 8 },
:confirmation => true,
:presence => true,
:if => :password_required?
def password_required?
crypted_password.blank? || password.present?
end
所以基本上,只有crypted_password
在数据库中没有设置(意味着正在创建新记录)或password
提供新记录时才会运行验证。
您可以像这样更新用户的单个属性
@user is that user whose attribute you want to update
例如用户名
@user.update_attributes(:user_name => "federe")
试试看,它只会更新一个属性..
试一试update_column(name, value)
,可能会奏效。
ActiveRecord 有一个 'update-column' 方法可以跳过验证和回调:
http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_column
但是,我建议这可能很危险-您有 :before_save 过滤器是有原因的。如果您在过滤器上放置 :except 方法以在特定情况下规避,它不仅可以重用,而且可以保持行为一致,并避免将方法隐藏在绕过模型的验证/回调堆栈的控制器中。
我个人并不太热衷于在任何地方看到像 update_column 这样的方法,除了模型中的受保护方法。
尝试 :
要绕过回调和验证,请使用:
User.update_all({:field_name => value},{:id => 1})
只是想让你知道 :
在 Rails 中,update_attribute 方法绕过模型验证,而 update_attributes 和 update_attributes!如果您尝试保存的记录无效,将失败(分别返回 false 或引发异常)。
两者之间的区别是 update_attribute 使用 save(false) ,而 update_attributes 使用 save 或者你可以说 save(true) 。