Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails与验证和工厂管理有很多联系_Ruby On Rails_Rspec_Factory Bot - Fatal编程技术网

Ruby on rails Rails与验证和工厂管理有很多联系

Ruby on rails Rails与验证和工厂管理有很多联系,ruby-on-rails,rspec,factory-bot,Ruby On Rails,Rspec,Factory Bot,考虑一个包含用户模型、列表模型和项目模型的rails项目 list.rb 为此,我有一个这样的工厂: factory :ordered_list_unpublished, traits: :ordered do transient do items_count 5 end after(:build) do |list, evaluator| create_list(:item, evaluator.items_count, user: list.user, list:

考虑一个包含用户模型、列表模型和项目模型的rails项目

list.rb

为此,我有一个这样的工厂:

factory :ordered_list_unpublished, traits: :ordered do
  transient do
    items_count 5
  end
  after(:build) do |list, evaluator|
    create_list(:item, evaluator.items_count, user: list.user, list: list)
  end
end
但是当我创建:ordered_list_未发布时,验证一直失败,因为验证失败:Items count为零。必须至少存在一个项目。

您正在调用create,它将尝试在项目创建后将其保存到您的数据库中。after:build回调将在创建完成后运行,因此它试图在添加允许其通过验证的项之前保存到数据库中

与其创建,不如尝试

您应该能够继续,因为这不会试图保存模型

可能需要考虑是否确实需要验证项目数是否大于1,因为在某些情况下,可能需要先创建项目,然后再添加项目

另一个注意事项是,验证时,可以指定仅在第一次创建时进行验证,或忽略第一次创建,然后仅在更新时进行验证:

validates :email, uniqueness: true, on: :create
validates :email, uniqueness: true, on: :update

工厂的这一变化使其得以运作:

factory :ordered_list_unpublished, traits: [:ordered, :published] do
  transient do
    items_count 5
  end

  before(:create) do |list, evaluator|
    list.items << build_list(:item, evaluator.items_count, user: list.user, list: list)
  end
end
多亏了这个

validates :email, uniqueness: true, on: :create
validates :email, uniqueness: true, on: :update
factory :ordered_list_unpublished, traits: [:ordered, :published] do
  transient do
    items_count 5
  end

  before(:create) do |list, evaluator|
    list.items << build_list(:item, evaluator.items_count, user: list.user, list: list)
  end
end