最近Railsを始めた初心者です。
Modelの中で、画面からの入力内容を確認するためにvalidatesを書くことが多いと思いますが、その内容を他のModelからも使い回す事はできないでしょうか。
いくつか画面はあるのですが、IDの様な項目はどれも同じルールでチェックを行いたいので、できるだけ1カ所にまとめたいと考えています。
現在は以下の様に、Model毎にvalidatesを書いているのですが、すべて同じ内容になっています。
ruby
1class Sample < ActiveRecord::Base 2 validates :name, presence: true, length: { maximum: 50 }, format: { without: /[<|>|&]/} 3end
カスタムバリデーションを使えば良いのかと思ったのですが、それをModelから呼ぶだけだとエラーメッセージまで共通になってしまうので、それはやりたくないと思っています。
画面毎のIDには、異なる項目名をつけているので、例えば次の様にエラーメッセージは分けたいと考えています。
・「社員ID」は必須項目です。
・「備品ID」は50文字までです。
上の「」内さえModel毎に変更できれば十分です。
まとめると、以下の2点が質問内容になります。
1.同じバリデーションルールを、各Modelで共有したい。
2.1によるエラーメッセージは、各Modelの項目名で表示したい。
以上になります。ご教授お願いします。
=== 回答を受けたあと、解決策を追記 ===
以下の様な形で実現できました。
ruby
1class Sample < ActiveRecord::Base 2 validates :name, name: true 3end 4 5# バリデーター 6class NameValidator < ActiveModel::EachValidator 7 def validate_each(record, attribute, value) 8 if value.blank? 9 record.errors[attribute] << I18n.t('activerecord.errors.messages.blank') 10 elsif value.length > 50 11 record.errors[attribute] << I18n.t('activerecord.errors.messages.too_long', :count => 50) 12 elsif... 13 # 省略 14 end 15 end 16end 17 18application_ja.yml 19ja: 20 activerecord: 21 attributes: 22 sample: 23 name: "社員ID" 24 sample1: 25 name: "備品ID" 26 errors: 27 messages: 28 blank: "は必須項目です。" 29 too_long: "は#{count}文字までです。"
回答ありがとうございました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。