[英]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.