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

时间:2012-04-10 12:50:43

标签: ruby-on-rails update-attributes update-attribute

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

在执行此操作时,我尝试了update_attribute(),但它也在更改用户密码。

我认为密码正在改变,因为我在用户模型上使用了搁置密码的before_save方法。

update_attributes()无效,因为它正在检查密码的验证presence=>true

有没有办法实现这个目标?

5 个答案:

答案 0 :(得分:1)

您可以使用: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时才会运行验证。

答案 1 :(得分:0)

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

@user is that user whose attribute you want to update

例如user_name

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

试一试,它只会更新一个属性..

答案 2 :(得分:0)

试试update_column(name, value),它可能有用。

答案 3 :(得分:0)

ActiveRecord有一个'update-column'方法,可以跳过验证回调:

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_column

但是,我建议这可能很危险 - 你有:before_save过滤器有原因。如果在过滤器上放置:except方法以避开特定情况,它不仅可以重用,而且可以保持行为一致,并避免将方法隐藏在绕过模型验证/回调堆栈的控制器中。

我个人并不过分热衷于将类似update_column的方法作为模型中的受保护方法。

答案 4 :(得分:0)

尝试:

要绕过回调和验证,请使用:

User.update_all({:field_name => value},{:id => 1})

只是想让你知道:

  • 在Rails中,update_attribute方法绕过模型验证,而update_attributes和update_attributes!如果您要保存的记录无效,则会失败(分别返回false或引发异常)。

  • 两者之间的区别是update_attribute使用save(false),其中up​​date_attributes使用save或你可以说save(true)。