【问题标题】:update_attribute/s() is calling callback for save passwordupdate_attribute/s() 正在调用回调以保存密码
【发布时间】:2012-04-11 01:44:23
【问题描述】:

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

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

我认为密码正在更改,因为我在用户模型上使用了 before_save 方法来散列密码。

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

有什么方法可以实现吗?

【问题讨论】:

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


    【解决方案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 时才会运行验证。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        @user is that user whose attribute you want to update
        

        例如用户名

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

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

        【讨论】:

        • 但它正在检查验证
        【解决方案4】:

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

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

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

        我个人并不太热衷于将 update_column 之类的方法在任何地方除了视为模型中的受保护方法。

        【讨论】:

          【解决方案5】:

          试试:

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

          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) 。

          【讨论】:

            猜你喜欢
            • 2012-04-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-11-14
            • 1970-01-01
            相关资源
            最近更新 更多