0
0

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 3 years have passed since last update.

カスタマイズしたvalidationチェックを行う

Posted at

#開発環境

  • OS:macOS Big Sur 11.2.2
  • Ruby:2.6.5
  • Ruby on Rails:6.0.0
  • テキストエディタ:Visual Studio Code

#課題
presenceチェックとかnumericalityチェックとかだけではなくて、もっと複雑な入力制御がしたい。
具体的には、入力したある要素の状態に応じて他の要素に制限をつけたい。

プレゼントの申し込み機能というものを実装している。各プレゼントは必要ポイント数が決まっていて、ユーザーの投稿数(料理のレシピ投稿数)が必要ポイントに達している場合にのみ申し込みが受け付けられる仕様にしたい。ついでに「ポイントが足りません」みたいなエラーメッセージを出力したい。

#解決方法
自分でメソッドを作って指定する。

present_order_form.rb
validate :present_check
  def present_check
    # 投稿したレシピが足りていない場合は申し込みできない
      recipes = user.recipes
      point = present.point
      if point > recipes.length
        errors.add(:present, "このプレゼント応募には#{point}投稿が必要です")
        return
      end    
  end

これだけ。validate:の後にメソッドを指定するだけ。
エラーメッセージはerrors.add(カラム,"出力内容")で設定できる。
なんと簡単に設定できるのだろう。

#その後
・・・と味を占めて他のところでも使ってみたらエラーが起きた。

recipes_form.rb
validates :names_check

普通のヘルパーメソッドを使うときの癖でvalidatesと複数形にしてしまったのが原因。自分でカスタマイズしたメソッドを指定するときは単数形にする。
ちなみに、

ArgumentError:
  You need to supply at least one validation

出てくるエラーがこうなのだが、at least one validationは、あくまで「こちらが用意しているvalidatorの中から少なくとも1つ」指定してね〜くらいの意味なんだろう。

取り違えやすいので、

  • 複数用意されているヘルパーメソッドを使うので、validates
  • 専用(個別に)カスタマイズしたメソッドを使うので、validate

と覚えておく。

0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?