結論
has_many
assert my_model.errors.of_kind?(:base, "restrict_dependent_destroy.has_many".to_sym)
has_one
assert my_model.errors.of_kind?(:base, "restrict_dependent_destroy.has_one".to_sym)
ハマったところ
Rails6 から of_kind?
なんて便利なものが追加されているようだったので、まずはエラーの attribute と type を調べてみた。
p my_model.errors
#<ActiveModel::Errors [#<ActiveModel::Error attribute=base, type=restrict_dependent_destroy.has_many, options={:record=>"my string"}>]>
attribute が base
、 type が restrict_dependent_destroy.has_many
ということが分かった。
しかし、 .
が入っているから普通にシンボル書けないし脳死で文字列で渡そうと考えた。
( :"restrict_dependent_destroy.has_many"
とか、 to_sym
とかすれば良いだけだけど、そこまで頭が回らなかった)
assert my_model.errors.of_kind?(:base, "restrict_dependent_destroy.has_many")
全然動かない...
結構悩んで最終的にコードを見た結果、シンボルと文字列を区別してるじゃん!!
def of_kind?(attribute, type = :invalid)
attribute, type = normalize_arguments(attribute, type)
if type.is_a? Symbol
!where(attribute, type).empty?
else
messages_for(attribute).include?(type)
end
end
というわけでした。これって前もハマったような...ということで記事を書いてみました。