質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

1966閲覧

Modelに記述するvalidatesの内容を共有したい

shanxia

総合スコア1038

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2016/06/01 07:55

編集2016/06/07 04:01

最近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}文字までです。"

回答ありがとうございました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

モデルのクラスメソッドに#human_attribute_nameというのがあって、i18nファイルで定義した列名を取得できます(参考)。

Validatorを立てた上で、列名だけこのあたりで取得して差し込む、というのが適当ではないかと思います。

投稿2016/06/01 08:02

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問