【rails, Validation】開始日と終了日の逆転防止


やりたいこと

タスク管理アプリでタスクに登録できる「開始日」と「終了日」が逆転しないようにValidationをかけたい。

方法

思っていた以上に簡単に実装できました!!

・Step①: モデルにValidationを作成
・Step②: エラーメッセージの日本語化

Step①: モデルにValidationを作成

app/models/task.rb

class Task < ApplicationRecord
     :
  validate :start_end_check

  def start_end_check
    errors.add(:end_date, "は開始日より前の日付は登録できません。") unless
    self.start_date < self.end_date 
    end
 end

<実際の画面>


できた!!!!!
けれど、文章に違和感。

Step②: エラーメッセージの日本語化

このままだと「End Dateは開始日より前の日付で登録できません」とルー語も甚だしいので、
日本語化しました(ここでは詳細は省きますが、ja.ymlファイルに以下のように記述。)

config/locales/ja.yml
---
ja:
  activerecord:
         :
      task:
        task_title: "タイトル"
        start_date: "開始日"
        end_date: "終了日"
        :

<実際の画面>

やりたかったことができました!!
良い感じです。

errors.add について

しっかり公式も確認しておきます。
Railsガイド:Active Record バリデーション

errors.add

addメソッドを使って、特定の属性に関連するエラーメッセージを手動で追加できます。このメソッドは属性とエラーメッセージを引数として受け取ります。

errors.full_messages

errors.full_messages(または同等のerrors.to_a)メソッドは、エラーメッセージをユーザーが読みやすい形式で返します。以下のように、メッセージごとに頭が大文字の属性名を冒頭に追加します。

errors.add(:属性名, "エラーメッセージ")

となっていて、errors.full_messagesで呼び出せる。
このとき、メッセージの冒頭には先頭大文字の属性名が追加される。

まとめ

基本的にはrailsが自動で作成してくれるものを使用していたので、errors.addでメッセージを手動で作るやりかたを初めて知りました!
まだまだ知らないことがたくさん⋯日々精進します!

ちなみに⋯

またしても、エラー文で表示が崩れてしまいました。
しかし、1度対処しているので冷静に解決することができました!

エラー文表示のレイアウト崩れについても記事にしておりますので、同じような現象が起こってしまった方はぜひこちらも参照いただけますと幸いです^^

参考