ruby-on-rails - 为什么更新此模型不触发验证?

标签 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

在我的单元测试中,我这样做:

user = User.create(:name => "Bob")
status1 = Status.create(:description => "available")
user.statuses << status1

并得到:

ActiveRecord::RecordInvalid: Validation failed: users can't be blank

但是,如果我不做最后一行:

status1.users << user

效果很好。

为什么会触发验证:

user.statuses << status1

更新:

完整测试

 test "Return all statuses associated with the manager" do
    manager = Manager.create(:email => "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c3a5acac83a1a2b1eda0acae" rel="noreferrer noopener nofollow">[email protected]</a>", :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

最佳答案

验证是针对状态,而不是针对用户。仅当更新模型时才会触发模型的验证,并且您实际上并未更新 User 模型(因为 statuses 是关联,而不是字段)。

如果您希望对一个对象进行验证来触发对另一个对象进行验证,则应使用 validates_linked:

class Status
  validates_associated :users
end

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

关于ruby-on-rails - 为什么更新此模型不触发验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6843707/

相关文章:

ruby-on-rails - 我应该在 Rails 应用程序中索引哪些字段?

ruby-on-rails - 如何在 rails-api gem 中使用 View 助手?

python - 无法让 pytest 理解设置中的命令行参数

Android Studio Espresso 空测试套件

mysql - 将 sql 查询转换为 Activerecord 查询 Rails 4

android - 带有 Rails 的 Twilio 中的 OTP 验证未知关键字错误

ruby-on-rails - 未定义方法 `validatable?' 对于 nil :NilClass for Devise mapping

ruby-on-rails - 为什么不使用全局(美元符号 $)变量?

javascript - 带推杆/faye 的 rails 应用

c# - 单元测试嵌套方法