Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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 3 rails rspec唯一性验证使用接受\u嵌套的\u属性\u_Ruby On Rails 3_Validation_Rspec_Unique - Fatal编程技术网

Ruby on rails 3 rails rspec唯一性验证使用接受\u嵌套的\u属性\u

Ruby on rails 3 rails rspec唯一性验证使用接受\u嵌套的\u属性\u,ruby-on-rails-3,validation,rspec,unique,Ruby On Rails 3,Validation,Rspec,Unique,我的模特关系像 class Cart < ActiveRecord::Base has_many :cart_items, :inverse_of => :cart, :dependent => :destroy accepts_nested_attributes_for :cart_items, :allow_destroy => :true, :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank

我的模特关系像

class Cart < ActiveRecord::Base
  has_many :cart_items, :inverse_of => :cart, :dependent => :destroy
  accepts_nested_attributes_for :cart_items, :allow_destroy => :true, :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } }
  validates_associated :cart_items
  validates :cart_name, :presence => {:message => "Must be filled" }
end

class CartItem < ActiveRecord::Base
  belongs_to :cart, :inverse_of => :cart_items
  validates :cart_item_no, :presence => {:message => "Must be filled"}, :uniqueness => {:message => "Already exists" }
end
下面的测试用例总是失败

it "should not be valid with same cart_id" do
  cart = FactoryGirl.build(:cart_with_cart_items)
  cart.should_not be_valid
end
然后我在控制台中探索,通过下面的代码示例,验证总是在购物车项目中两次返回同一个*cart\u item\u no*的true

cart = Cart.new(:cart_name => "yyy")
  => #<Cart id: nil, cart_name: "yyy">
2.times { cart.cart_items.build(:cart_item_no => 1000) }
  => 2
cart.cart_items 
  => [#<CartItem id: nil, cart_item_no: 1000>, #<CartItem id: nil, cart_item_no: 1000>]
cart.valid?
  => true
cart.save!
  => true  
cart=cart.new(:cart\u name=>“yyy”)
=> #
2.times{cart.cart\u items.build(:cart\u item\u no=>1000)}
=> 2
cart.cart\u项目
=> [#, #]
购物车,有效吗?
=>正确
购物车,救命!
=>正确
这是rails的问题吗


如何解决测试用例?

仅针对数据库进行唯一性验证检查。在您的情况下,您有两个
cart\u项目
,它们彼此冲突,但与数据库中的任何记录都不冲突,因此单独而言,两者都是有效的,这就是验证通过的原因

您可以在
购物车
类中添加自定义验证(未测试):

验证:唯一的购物车项目
def唯一的购物车项目
除非购物车项目。收集(&:购物车项目号)。uniq.size

这会将唯一的
购物车项目编号
值与
购物车项目编号
进行比较。如果它们不相同,则如果我在购物车模型中注释
接受
的嵌套属性,则会出现重复的
购物车项目号

,按预期工作,即数据库表中只保存一条购物车项目记录,返回另一个对象时出错。
cart = Cart.new(:cart_name => "yyy")
  => #<Cart id: nil, cart_name: "yyy">
2.times { cart.cart_items.build(:cart_item_no => 1000) }
  => 2
cart.cart_items 
  => [#<CartItem id: nil, cart_item_no: 1000>, #<CartItem id: nil, cart_item_no: 1000>]
cart.valid?
  => true
cart.save!
  => true  
validates :unique_cart_items

def unique_cart_items
  unless cart_items.collect(&:cart_item_no).uniq.size < cart_items.size
    # set some error attribute here
  end
end