ruby 在验证之外访问Rails验证上下文

evrscar2  于 2023-05-28  发布在  Ruby
关注(0)|答案(3)|浏览(157)

我想在验证本身之外使用rails验证上下文,特别是在回调中。
我能在源代码中看到有效的吗?方法内部使用了validation_context attr_accessor,但它似乎总是nil。
看看rails的源代码,它似乎除了nil之外没有别的办法,所以也许这是rails中的一个bug?
https://github.com/rails/rails/blob/master/activemodel/lib/active_model/validations.rb#L331

6vl6ewon

6vl6ewon1#

正如@rowend所指出的,validation_context(现在)在某些回调中可用,包括before_validation,但不是大多数后来的回调。如果稍后需要上下文,则可以将其保存为早期回调中的示例变量。
如果要在创建新对象期间锁定关联对象,则可以使用此选项。例如,一棵树只能容纳100个苹果,所以每次创建苹果时都要锁定该树,这样就不会意外地将两个苹果同时添加到已经容纳99个苹果的树中:

# app/models/apple.rb
before_validation :save_validation_context
around_create :lock_tree

def save_validation_context
  @saved_validation_context = validation_context
end

def lock_tree
  tree.with_lock do
    validate!(@saved_validation_context)
    yield
  end
end

这适用于Rails版本6.1.7.2和Ruby版本3.1.3。

vuktfyat

vuktfyat2#

也许现在去派对有点晚了。
我可以在回调函数before_validation中使用方法validation_context,它包含了上下文。
Rails版本:6.1.3
Ruby版本:2.7.2

jecbmhm3

jecbmhm33#

您可以编写自己的方法来执行与您想要使用的验证相同的操作。

相关问题