Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.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 为什么';是否更新此模型触发验证?_Ruby On Rails_Ruby On Rails 3_Unit Testing_Validation - Fatal编程技术网

Ruby on rails 为什么';是否更新此模型触发验证?

Ruby on rails 为什么';是否更新此模型触发验证?,ruby-on-rails,ruby-on-rails-3,unit-testing,validation,Ruby On Rails,Ruby On Rails 3,Unit Testing,Validation,对于Rails 3.1,我有: class Status < ActiveRecord::Base has_many :participations, :dependent => :destroy has_many :users, :through => :participations validates :users, :presence => true end 类状态:破坏 有多个:用户,:通过=>:参与 验证:users,:presence=>tru

对于Rails 3.1,我有:

class Status < ActiveRecord::Base
  has_many :participations, :dependent => :destroy
  has_many :users, :through => :participations

  validates :users, :presence => true
end
类状态:破坏
有多个:用户,:通过=>:参与
验证:users,:presence=>true
结束
在我的单元测试中,我会:

user = User.create(:name => "Bob")
status1 = Status.create(:description => "available")
user.statuses << status1
user=user.create(:name=>“Bob”)
status1=状态。创建(:description=>“可用”)

user.statuses因为执行
user.statuses操作时,
status1.users
集合不会自动更新。验证处于
Status
状态,而不是
user
状态。模型的验证仅在该模型更新时触发,并且您实际上没有更新
用户
模型(因为
状态
是一个关联,而不是一个字段)

如果希望对一个对象的验证触发对另一个对象的验证,则应使用
validates\u associated

class Status
  validates_associated :users
end

(不过,在相关说明中,为什么一个状态有多个用户?似乎一个状态应该只有一个用户。)

感谢您的回复,那么为什么集合没有得到更新会导致验证被触发?@pingu为什么您需要对状态模型进行用户验证?这意味着,如果没有已分配的用户(这就是status.create正在尝试做的),就无法保存状态。谢谢john,这很有帮助,但是为什么“用户不能为空”的验证会在那里触发呢?因为我正在为用户分配状态。如果在实际创建状态时发生验证错误,我想我不会那么惊讶。这是有意的:-)我的应用程序将允许共享状态。
user.statuses << status1
 test "Return all statuses associated with the manager" do
    manager = Manager.create(:email => "foo@bar.com", :password => "password", :password_confirmation => "password")

    workshop = Workshop.create(:name => "Bob Autos")
    manager.workshop = workshop
    manager.save

    user = User.create(:name => "a customer")

    workshop.users << user

    status1 = Status.create(:description => "Car is ready")
    status2 = Status.create(:description => "problem with exhaust")
    status3 = Status.create(:description => "parts delivered")

    user.statuses << status1
    user.statuses << status2

    assert_equal([status1, status2], manager.statuses)

    user.statuses << status3

    assert_equal([status1, status2, status3], manager.statuses)
  end
class Status
  validates_associated :users
end