簡単! Railsで過去の日付に対するバリデーションを設定してみた

こんにちは!kossyです!




ペット市場が盛り上がっているようです。
https://headlines.yahoo.co.jp/hl?a=20181007-00010001-kantele-bus_allheadlines.yahoo.co.jp

1兆5000億という数字自体はめちゃくちゃ市場規模が大きいわけではないですが、
順調に成長している市場は魅力的ですね。

私もペットを飼っていた時がありますが、
ペットに対しては財布の紐も緩みがちだったので、
お金をかけてしまう人たちの気持ちはよくわかります。

まだまだ伸びるんじゃないでしょうか。











さて、今回は入力された日付が過去の日付だった場合に弾くような
バリデーションの実装方法をブログに残したいと思います。



環境
Rails5.1.6
Ruby2.5.1
MacOS




実装方法

addメソッドを利用して、特定の属性に関する任意のエラーメッセージを付与しています。
if文は後置ifの形を取って、カラムの値がnilまたはDateクラスのtodayメソッドを使って取得した本日の日付と、
date型のカラム名に渡ってきた値を比較して、
本日の日付よりも前の値だった場合に弾くように実装しています。

app/models/任意のモデルファイル.rb

validate :pretend_ago

def pretend_ago(メソッド名は任意)
    errors.add(:date型のカラム名, '表示させたいエラーメッセージ') if date型のカラム名.nil? || date型のカラム名 < Date.today
end

なぜかはわかりませんが、

validates :pretend_ago

とするとエラーになりました。

エラーメッセージの日本語化は
kossy-web-engineer.hatenablog.com
こちらのエントリが参考になるかと思います。



参考にさせていただいた記事
Active Record バリデーション | Rails ガイド
日付の前後を比較するバリデーションを書く - ブログ