如何在不验证其余属性/列的情况下验证和更新1个属性/列?

时间:2015-03-22 20:07:41

标签: ruby-on-rails

我希望我的用户能够更新他们的电子邮件地址,如果他们自己进行身份验证的话。

我的代码看起来像这样......

    @user = User.find_by_email(params[:user][:old_email].downcase)

    if @user
        if @user.authenticate(params[:user][:password])
            @user.email = params[:user][:email]

            if @user.update_attributes(email: params[:user][:email])

这些方面的东西。基本上,params是old_email,用户想要更改的电子邮件,以及他们的密码。我们提取与old_email(当前电子邮件)匹配的记录。然后我们验证密码是否匹配。如果是这样,我们只想更改电子邮件和电子邮件,如果电子邮件符合我们的模型中的条件:email列。

我遇到的问题是,当我到达@user.update_attributes(em...时,我收到以下错误

"Password is too short (minimum is 6 characters)"

我不希望它验证密码,密码甚至不应该参与更新。我只对这里更改电子邮件感兴趣。我只想在电子邮件字段上进行验证,而不是其他任何验证,我只想更新电子邮件字段。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以按#update_columns更新特定列。它直接在发出UPDATE SQL语句的数据库中更新属性,并将它们设置在接收器中。

跳过 validationscallbacks

@user.update_columns(email: params[:user][:email])

请在更新前记得清理电子邮件地址。

Validation属于模型,但是您需要在控制器中进行验证,请定义私有操作:

private
  def valid_email?(email)
    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
    email.present? && (email =~ VALID_EMAIL_REGEX)
  end

然后您的状况检查将是:

if @user.authenticate(params[:user][:password]) && valid_email?(params[:user][:email])