播种因验证错误而失败

时间:2015-06-01 17:55:50

标签: ruby-on-rails ruby ruby-on-rails-4 seeding

在我的用户模型中,我添加了一个新变量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:droprake db:createrake db:migraterake 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

1 个答案:

答案 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参数的原因。