update_attribute/s() 正在回调以保存密码



我正在尝试从管理控制器(不是用户控制器)更新用户模型的单个属性。

这样做时,我尝试了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时,才会运行验证。

尝试update_column(name, value),它可能会起作用。

您可以像这样更新用户的单个属性

@user is that user whose attribute you want to update

例如user_name

       @user.update_attributes(:user_name => "federe")

尝试一下,它只会更新一个属性。

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(true),或者你可以说save(true)。

相关内容

  • 没有找到相关文章

最新更新