Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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 有至少两个条目的\u many_Ruby On Rails_Ruby_Rspec_Factory Bot - Fatal编程技术网

Ruby on rails 有至少两个条目的\u many

Ruby on rails 有至少两个条目的\u many,ruby-on-rails,ruby,rspec,factory-bot,Ruby On Rails,Ruby,Rspec,Factory Bot,我需要一个至少有两个条目的多个关联,如何编写验证,如何使用RSpec+factory girl进行测试?这是我到目前为止得到的,但是它失败了,因为ActiveRecord::RecordInvalid:Validation failed:bar不能是空的,我完全被RSpec测试卡住了 /example\u app/app/models/foo.rb class Foo < ActiveRecord::Base has_many :bars validates :bars, :pre

我需要一个至少有两个条目的多个关联,如何编写验证,如何使用RSpec+factory girl进行测试?这是我到目前为止得到的,但是它失败了,因为
ActiveRecord::RecordInvalid:Validation failed:bar不能是空的
,我完全被RSpec测试卡住了

/example\u app/app/models/foo.rb

class Foo < ActiveRecord::Base
  has_many :bars
  validates :bars, :presence => true, :length => { :minimum => 2}
end
class Bar < ActiveRecord::Base
  belongs_to :foo
  validates :bar, :presence => true
end
FactoryGirl.define do
  factory :foo do
     after(:create) do |foo|
       FactoryGirl.create_list(:bar, 2, foo: foo)
     end
  end
end
FactoryGirl.define do
  factory :bar do
    foo
  end
end
/example app/spec/factories/bar.rb

class Foo < ActiveRecord::Base
  has_many :bars
  validates :bars, :presence => true, :length => { :minimum => 2}
end
class Bar < ActiveRecord::Base
  belongs_to :foo
  validates :bar, :presence => true
end
FactoryGirl.define do
  factory :foo do
     after(:create) do |foo|
       FactoryGirl.create_list(:bar, 2, foo: foo)
     end
  end
end
FactoryGirl.define do
  factory :bar do
    foo
  end
end

您想使用自定义验证器

class Foo < ActiveRecord::Base
  has_many :bars
  validate :validates_number_of_bars

  private
  def validates_number_of_bars
    if bars.size < 2
      errors[:base] << "Need at least 2 bars"
    end
  end
end
class Foo类Foo2)
结束
结束
它“应该验证存在的酒吧”做什么
FactoryGirl.build(:foo,:bar=>[])。应至少包含(1)个。\u(:bar)上出现错误
结束
它“应该验证至少有两个条”这样做
foo=FactoryGirl.build(:foo)
foo.bar.push FactoryGirl.build(:bar,:foo=>nil)
foo.应该至少有(1)个错误(:bar)
结束

:length
用于字符串,而不是关系。这很好,但我不会命名方法
条数,因为这不是它计算的。更好的命名方法是
验证\u条的\u编号\u
或让它实际返回编号,然后编写一个验证规则将其视为属性。当然,这只是一个示例没有理由说明一个技术示例不能同时也是一个好的样式示例。对于通过关联进行销毁,您需要这样做:if bar.选择{bar |!bar.marked|u for_destruction?}.size<2错误。添加(:bar,:too_short,:count=>2)end确实如此,我们的代码还检查“destructed?”属性`bar|count=bar.reject{bar | bar.destructed?| bar.marked|u for|destruction?}.size