gpt4 book ai didi

ruby-on-rails - 应该和 before_ 回调

转载 作者:行者123 更新时间:2023-12-02 00:04:15 27 4
gpt4 key购买 nike

我有简单的模型:

class Category < ActiveRecord::Base
belongs_to :board
validates :name, presence: true, uniqueness: {scope: :board_id}
validates :board, presence: true
validates :display_order, presence: true, uniqueness: {scope: :board_id}

before_save :set_display_order

private

def set_display_order
last = self.board.categories.order("display_order DESC").last
self.display_order = last.display_order + 100 if last
end
end

当我添加这个 before_save 回调时,这些测试开始失败:

  it { should validate_uniqueness_of(:display_order).scoped_to(:board_id) }
it { should validate_uniqueness_of(:name).scoped_to(:board_id) }

有错误(如果是私有(private)方法 last = ... 中的行):

 NoMethodError:
undefined method `categories' for nil:NilClass

其他应该测试工作正常:

  it { should validate_presence_of(:name) }
it { should validate_presence_of(:board) }
it { should belong_to :board }

知道这里有什么问题吗?我尝试将 before_save 更改为 before_validation 但还是一样。

最佳答案

因为应该在数据库中创建记录。 Gem 创建记录跳过验证

http://rubydoc.info/github/thoughtbot/shoulda-matchers/master/Shoulda/Matchers/ActiveModel#validate_uniqueness_of-instance_method如果给定的属性不是唯一的,则确保模型无效。如果数据库中不存在记录,它将使用第一个现有记录或创建一个新记录。它只是使用“:validate => false”来绕过验证,因此如果存在“NOT NULL”约束,它可能会失败。在这种情况下,您必须在调用“validate_uniqueness_of”之前创建一条记录。

在您创建的 category 为空的情况下,这意味着 category.board # => nil 并且您从 nil 调用方法 categories

你应该自己创建一个记录来测试唯一性。

关于ruby-on-rails - 应该和 before_ 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19410519/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com