繁体   English   中英

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

[英]How can I validate and update 1 attribute/column, without validating the rest?

我希望我的用户能够通过身份验证来更新其电子邮件地址。

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

    @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])

遵循这些原则。 基本上,参数是old_email,用户想要更改的电子邮件以及他们的密码。 我们提取与其old_email(当前电子邮件)匹配的记录。 然后,我们验证密码是否匹配。 如果是这样,我们当然只希望更改电子邮件和电子邮件,如果该电子邮件符合我们的模型中:email列的条件,则该电子邮件是必需的。

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

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

我不希望它通过密码进行验证,即使更新也不应涉及密码。 我只对更改此处的电子邮件感兴趣。 我只想在电子邮件字段上进行验证,而没有其他验证,我只想更新电子邮件字段。 我该如何实现?

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

它将跳过 验证回调

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

在更新之前,请记住清理电子邮件地址。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM