0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ruby on RailsAdvent Calendar 2022

Day 10

Railsで、dependent: :restrict_with_errorをassertできなくてハマった話

Last updated at Posted at 2022-12-09

結論

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

というわけでした。これって前もハマったような...ということで記事を書いてみました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?