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

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

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

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

Q&A

解決済

2回答

1356閲覧

バリデーションのonオプションをupdate内でうまく発動したい。

kohdohg

総合スコア12

Ruby on Rails

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

0グッド

0クリップ

投稿2020/08/27 05:45

編集2020/08/27 05:53

validatesメソッドのonオプションの発動タイミングで悩んでいます。

rails

1package.rb 23validates :haitatsu_kiboubi, presence: true, on: :step20

これをupdateで

rails

1packages_controller 2 3 def update 4 5 if @package.valid?(:step20) && @package.update(package_params) 6 flash[:success] = "更新されました。" 7 redirect_to root_path 8 else 9 render "edit" 10 endd 11 end

と記述すれば、入力フォームにhaitatsu_kiboubiの値が入っていれば更新されると思っていました。
が、実際は値なしと判断されて、editに差し戻されます。

if文の前後を入れ替えて

rails

1packages_controller 2 3if @package.update(package_params) && @package.valid?(:step20) 4

と記述すると、バリデーションは効くのですが、先にupdateが働いてしまい、バリデーション対象外の項目はDBで更新されてしまいます。

そもそも最初から

rails

1package.rb 2 3validates :haitatsu_kiboubi, presence: true, on: :update

と記述すれば、問題ないのはわかっているのですが、update内で条件によってバリデーション対象を切り替えたいため、上記のような書き方をしています。

書き方を修正すれば動くのか、別のアプローチを取った方がいいのか、お教え下さい。

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

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

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

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

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

guest

回答2

0

ベストアンサー

先にassign_attributesで値の変更だけしてからバリデーション、保存するという形ではどうでしょうか。

ruby

1@package.assign_attributes(package_params) 2if @package.valid?(:step20) && @package.save

投稿2020/08/27 05:53

maisumakun

総合スコア146018

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

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

maisumakun

2020/08/27 05:55

元の「if @package.valid?(:step20) && @package.update(package_params)」では、valid?の判定時点でまだpackage_paramsからの値が代入されていません。
kohdohg

2020/08/27 06:05

教えていただいたとおり修正したら、動きました。完璧です! assign_attributesで、先に値の変更がかけられるのですね。 ありがとうございました!
guest

0

コールバックが役に立ちませんか?

Active Record コールバック - Railsガイド

投稿2020/08/27 05:53

naokit-dev

総合スコア424

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問