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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

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

Q&A

解決済

1回答

2860閲覧

バリデーションで未入力のメッセージが入ってきてしまう

Maar

総合スコア48

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

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

0グッド

0クリップ

投稿2017/05/19 07:02

date型のフィールドにpresenceとformat(例:2017-01-01)のバリデーションをかけてるのですが、formatの方だけのバリデーションをかけたいときに適当な文字列(fffffなど)を入れたのですが、presenceの方のバリデーションメッセージも入ってきてしまいます。
未入力の時はpresenceのエラーメッセージを、yyyy-mm-dd以外の時はformatのエラーメッセージを出したいときにこれだとどうしたらいいかわかりません。
どうやって対処すればいいですか?

ruby

1:date=>["を入力してください", "は不正な値です"] 2 3validates :date, presence: true, format: { with: /[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/ }

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

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

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

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

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

guest

回答1

0

ベストアンサー

どうしてもしたければ

ruby

1validates :date, presence: true 2validates :date, format: { with: /[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/ } ,if: "date.present?" 3

とかやるしかないですね。
これは仕様です。

例えば、あなたが登録画面で入力して

登録しようとしたらフリガナはカタカナで入力してくださいと言われ

ちっとなって、それを直し再度登録したら
今度はメールアドレスが違いますと言われというのを

何回もくり返されたらどうしますか?
昔はそんなソフトいくつもありましたが、さすがに切れますよね。
そのブチ切れを防ぐためにvalidationは途中で失敗しても最後まで行われ
全てのエラーメッセージが入ります。
当たり前の仕様なので、気になるんだったらifやunnlessで対応してください。

ところで、

date型のフィールドにpresenceとformat(例:2017-01-01)のバリデーションをかけてる

そもそも、この行為が意味がありません。
Railsはdate型のcolumn(列)にデータが代入されたら
まず日付型に変換しようとします。
そこで日付に変換可能 例えば'20170101'だったら'2017-01-01'に変換して保存
そこで日付に変換不可能 例えば'fffffff'だったらデータを破棄します。

なので日付に変換可能かしか判断できないと思います。
どうしても2017-01-01の形式じゃないといやだというのなら
html側にformatを指定してください。

投稿2017/05/19 08:16

moke

総合スコア2241

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

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

Maar

2017/05/22 04:12

ご回答ありがとうございます。 仕様だったのですね、確かにおっしゃる通りです。 とても勉強になりました、またよろしくお願い致します!
moke

2017/05/22 06:46 編集

よかったです。 一応頑張って書いたので後半も 目を通していただくと嬉しいです。
Maar

2017/05/23 04:26

date型の仕様も全く知らない情報だったのでこれから気をつけて実装しようと思います! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問