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

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

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

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

Q&A

解決済

1回答

2335閲覧

バリデーションエラー時に値を元に戻す方法

kodai

総合スコア759

Ruby on Rails

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

0グッド

0クリップ

投稿2018/05/17 04:06

編集2018/05/17 04:16

Railsでモデルのsave!を実行してバリデーションエラーが発生したとき、モデルの値を自動で元に戻す方法ってあるんでしょうか?

例えばProject(案件)モデルがあって、このモデルはユーザが入力する名称や終了予定日、状態を管理するためのstatusフィールドがあるとします。
Project作成直後は状態がpendingになっていて、終了予定日を入力して「プロジェクトを開始」すると状態がrunningになるような入力画面があります。このときProjectモデルの実装はこんな感じで考えています。

project.rb

1def start_project(due_date) 2 self.due_date = due_date # ユーザが指定した終了日 3 self.started_at = DateTime.now # 開始日時 4 self.status = 'running' # 状態`status`を進行中にする 5 save! 6end

ユーザが入力したdue_datesave!バリデーションエラーになったとき、画面にエラーメッセージを表示して再入力を促します。入力したdue_dateはそのまま入力欄に保持されて欲しいのですが、画面に表示しているstatusstarted_atは元のpendingnilに戻したいです。
rescue でキャッチして値を自分でひとつずつクリアする方法しか思い浮かびませんでした。

フォームクラスのようなものでバリデーションするRails以外のWAFはモデルと入力値が関連付いてないので問題ないのですが、Railsのようにモデルを直接画面に表示したり、バリデーションしたりする系のフレームワークってどうされてるんでしょう?

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

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

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

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

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

guest

回答1

0

ベストアンサー

started_atなどの代入前にvalid?で状態をチェックして、うまく行かなければそこでActiveRecord::RecordInvalidを投げてしまう、というようにしてはどうでしょうか。

もっとも、自分で作った書き込みメソッドを使うということ自体、Rails的に少し違うかなという気もします。

投稿2018/05/17 04:48

編集2018/05/17 04:48
maisumakun

総合スコア145121

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

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

kodai

2018/05/17 09:13

コメントありがとうございます。`valid?`でチェックする件、参考になりました。 > もっとも、自分で作った書き込みメソッドを使うということ自体、Rails的に少し違うかなという気もします。 ここの意味が理解できなかったのですが、質問に記載したコードがRails的ではないということでしょうか? こんな書き方がRailsっぽい!というのがあれば教えて頂けますでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問