Ruby on rails 更新时的Rails 5验证也会在创建时激发

Ruby on rails 更新时的Rails 5验证也会在创建时激发,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,我正在使用factory bot gem为rspec测试构建我的factory对象。在我的模型中有这样的验证: validates :reason_for_change, presence: true, on: :update 等级库测试失败,因为无法创建对象本身: Failure/Error: let(:user) { create(:super_user) } ActiveRecord::RecordInvalid: Validation failed: Prof

我正在使用factory bot gem为rspec测试构建我的factory对象。在我的模型中有这样的验证:

validates :reason_for_change, presence: true, on: :update
等级库测试失败,因为无法创建对象本身:

Failure/Error: let(:user) { create(:super_user) }

     ActiveRecord::RecordInvalid:
       Validation failed: Profile reason for change can't be blank
我也试过:

validates :reason_for_change, presence: true, unless: :new_record?
同样的错误。这也是:

validates :reason_for_change, presence: true, if: :my_custom_method

def my_custom_method
  !new_record?
end
同样的结果。但是,当我使用上一次验证并在自定义方法中设置断点时,如下所示:

def my_custom_method
  binding.pry
end
如果首先手动检查这是一个
新记录吗?
,每当它的计算结果为true时,我都会返回false(手动输入)。对于每一个计算为false的值,我都会返回true(手动输入)

在这种情况下,所有测试都通过。这是怎么回事?我正在使用rails
5.0.1

更新1:

这是我的超级用户工厂:

factory :super_user do
    transient do
      email { nil }
    end
    first_name { Faker::Name.first_name }
    last_name  { Faker::Name.last_name }
    gender { 'male' }
    age { Random.rand(18..40) }
    ethnicity { '' }
    avatar { Rack::Test::UploadedFile.new(Rails.root.join('spec/files/1.png')) }
  end

我也不认为我应该修改工厂,只是为了让它工作。这应该有用。

我的评论的复制粘贴: 请检查日志。我相信,你会看到这样的事情:

插入超级用户()值(…)
更新super_users SET field=val
如果是,请检查保存记录时可能运行的其他回调。我的猜测是,您有另一个回调更新相同的记录,例如,在保存回调之后。
在尝试我的建议之前,你应该先禁用验证。

@spickermann我刚刚更新了我很困惑。工厂针对的是
超级用户
,但错误消息显示:配置文件更改原因不能为空。个人资料和超级用户是一回事吗?是的,很抱歉这让人困惑@spickermann@Remember_me,请检查日志。我相信,您会看到类似这样的内容:
INSERT-INTO-super_-users()值(…);更新super_users SET field=val
如果是,请检查保存记录时可能运行的其他回调。我的猜测是,您有另一个回调更新了中的同一记录,例如,在保存回调之后。忘记提及-在尝试我的建议之前,您应该先禁用该验证。