#開発環境
- OS:macOS Big Sur 11.2.2
- Ruby:2.6.5
- Ruby on Rails:6.0.0
- テキストエディタ:Visual Studio Code
#課題
presenceチェックとかnumericalityチェックとかだけではなくて、もっと複雑な入力制御がしたい。
具体的には、入力したある要素の状態に応じて他の要素に制限をつけたい。
プレゼントの申し込み機能というものを実装している。各プレゼントは必要ポイント数が決まっていて、ユーザーの投稿数(料理のレシピ投稿数)が必要ポイントに達している場合にのみ申し込みが受け付けられる仕様にしたい。ついでに「ポイントが足りません」みたいなエラーメッセージを出力したい。
#解決方法
自分でメソッドを作って指定する。
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(カラム,"出力内容")
で設定できる。
なんと簡単に設定できるのだろう。
#その後
・・・と味を占めて他のところでも使ってみたらエラーが起きた。
validates :names_check
普通のヘルパーメソッドを使うときの癖でvalidates
と複数形にしてしまったのが原因。自分でカスタマイズしたメソッドを指定するときは単数形にする。
ちなみに、
ArgumentError:
You need to supply at least one validation
出てくるエラーがこうなのだが、at least one validation
は、あくまで「こちらが用意しているvalidatorの中から少なくとも1つ」指定してね〜くらいの意味なんだろう。
取り違えやすいので、
- 複数用意されているヘルパーメソッドを使うので、validates
- 専用(個別に)カスタマイズしたメソッドを使うので、validate
と覚えておく。