在我的用户模型中,我添加了一个新变量new_email
。为此,我补充说:
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :new_email, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX }
在迁移文件中:
t.string :new_email
我没有在我的种子文件中添加任何关于这个新变量的内容。播种时我收到错误:ActiveRecord::RecordInvalid: Validation failed: New email is invalid
。如果我从模型文件中删除validates
行,则会成功播种。我尝试重置我的数据库:rake db:drop
,rake db:create
,rake db:migrate
和rake db:seed
,但结果相同。可能导致此错误的原因是什么?
使用params的控制器方法:
def create
@user = User.new(usernew_params)
if @user.save
@user.send_activation_email
flash[:success] = "A confirmation email has been sent to you"
redirect_to root_url
else
render 'new'
end
end
def update
@user = User.friendly.find(params[:id])
if @user.update_attributes(userupdate_params)
flash[:success] = "Profile updated"
redirect_to @user
else
render 'edit'
end
end
private
def usernew_params
params.require(:user).permit(:email,
:username,
:password,
:password_confirmation)
end
def userupdate_params
params.require(:user).permit(:email,
:email_new,
:avatar,
:organization,
:activated,
:password,
:password_confirmation)
end
我的种子文件(遗漏了与此模型无关的其他模型):
99.times do |n|
username = "fakename#{n+1}"
email = "example-#{n+1}@railstutorial.org"
password = "password"
organization = Faker::Company.name
User.create!(username: username,
email: email,
password: password,
password_confirmation: password,
activated: true,
activated_at: Time.zone.now,
organization: organization)
end
答案 0 :(得分:0)
问题是您在每个请求上验证new_email
并且不允许它为空。由于未在种子文件中设置,并且您基于Regexp
进行验证,因此每次都会失败。
根据您描述的用例,我会推荐这个
validates :new_email, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
allow_blank: true,
on: :update
这将做两件事:
new_email
为空""
或完全省略nil
而不会失败。 new_email
创建,因此此验证仅在update
上运行。 虽然allow_blank
相当轻量级的验证,但我仍然会尝试建议不要在不需要时运行代码,这就是我添加on
参数的原因。