【发布时间】:2016-07-11 16:55:28
【问题描述】:
我有 3 个非常简单的模型
class Receipt < ActiveRecord::Base
has_many :receipt_items
end
class ReceiptItem < ActiveRecord::Base
after_create :create_transaction
belongs_to :receipt
private
def create_transaction
Transaction.new.save!
end
end
class Transaction < ActiveRecord::Base
validates :transacted_at, :presence => true
end
所以每次创建一个新的 ReceiptItem 时,它都会触发 after_create 回调以使用 save! 创建一个新的 Transaction 对象。但是因为 Transaction 要求存在 transacted_at 列,所以 Transaction.new.save!我认为每次都应该引发 ActiveRecord::RecordInvalid。
然后我创建了 3 个测试:
test "creating an invalid transaction" do
assert_raises ActiveRecord::RecordInvalid do
Transaction.new.save!
end
end
test "creating invalid transaction in after_create" do
assert_raises ActiveRecord::RecordInvalid do
ReceiptItem.new.save!
end
end
test "creating invalid transaction in after_create of associated model" do
assert_raises ActiveRecord::RecordInvalid do
r = Receipt.new
i = r.receipt_items.new
r.save!
end
end
前两个测试按预期通过。然而,第三次测试失败了,因为从未引发异常。事实上,如果我在 'r.save!' 之后添加以下行行:
r.reload
p r.inspect
p r.receipt_items.inspect
可以看到 Receipt 和 ReceiptItem 已经创建成功了。
此外,如果我更换了
assert_raises ActiveRecord::RecordInvalid do
与
assert_difference "Transaction.count", +1 do
我确认已创建 Receipt 和 ReceiptItems 但未创建 Transaction。这意味着交易的创建失败,但被默默地忽略了,即使我使用了“保存!”而不是仅仅“保存”。
有谁知道这是预期的行为,还是这实际上是 Rails 中的错误?
(在 Rails 4.0.13 和 4.2.0 中尝试过)
更新
我在这里提交了错误报告: https://github.com/rails/rails/issues/24301
【问题讨论】:
-
你能用
p r.inspect和p r.receipt_items.inspect的输出更新你的问题吗? -
当然,它们是:“#" "#<:associations::collectionproxy id: created_at: updated_at:>]>"
标签: ruby-on-rails validation activerecord callback