我希望我的用户能够更新他们的电子邮件地址,如果他们自己进行身份验证的话。
我的代码看起来像这样......
@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)"
我不希望它验证密码,密码甚至不应该参与更新。我只对这里更改电子邮件感兴趣。我只想在电子邮件字段上进行验证,而不是其他任何验证,我只想更新电子邮件字段。我怎样才能做到这一点?
答案 0 :(得分:0)
您可以按#update_columns
更新特定列。它直接在发出UPDATE SQL
语句的数据库中更新属性,并将它们设置在接收器中。
跳过 validations和callbacks。
@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])