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

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

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

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

Q&A

解決済

2回答

1096閲覧

トランザクション例外処理がうまく動きません

zoff77

総合スコア19

Ruby on Rails 5

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

0グッド

0クリップ

投稿2020/10/24 12:19

現在、セレクトボックスの選択肢により、異なる更新処理を作っています。
下のようなセレクトボックスですが、
選択肢は「なし」「承認」「否認」「申請中」でカラム名はindicater_replyです
右のチェックボックスのカラム名はchangeで、チェックボックスにチェックをし、セレクトの選択肢を選んで更新するといった動きです。

「なし」「承認」「否認」の場合は問題なくカラムが更新され、flashが出るのですが
チェックをしない場合やセレクトが「申請中」の場合も「なし」「承認」「否認」と同じflashが出ます。
コントローラーの8行目で、チェックボックスにチェックがある、かつ「なし」「承認」「否認」の場合しか進行しない内容になっているのに、
なぜ、例外のエラーに飛ばないのかがわかりません。

恐れ入りますが、方法を教えて頂けますでしょうか。

イメージ説明

rb

1 def update_overtime_notice 2 ActiveRecord::Base.transaction do 3 o1 = 0 4 o2 = 0 5 o3 = 0 6 overtime_notice_params.each do |id, item| 7 if item[:indicater_reply].present? 8 if (item[:change] == "1") && (item[:indicater_reply] == "なし" || item[:indicater_reply] == "承認" || item[:indicater_reply] == "否認") 9 attendance = Attendance.find(id) 10 user = User.find(attendance.user_id) 11 if item[:indicater_reply] == "なし" 12 o1+= 1 13 item[:overtime_finished_at] = nil 14 item[:tomorrow] = nil 15 item[:overtime_work] = nil 16 item[:indicater_check] = nil 17 18 elsif item[:indicater_reply] == "承認" 19 item[:indicater_check] = nil 20 o2 += 1 21 attendance.indicater_check_anser = "承認しました" 22 elsif item[:indicater_reply] == "否認" 23 item[:indicater_check] = nil 24 o3 += 1 25 attendance.indicater_check_anser = "否認しました" 26 end 27 attendance.update_attributes!(item) 28 end 29 end 30 end 31 flash[:success] = "【残業申請】 #{o1}件なし, #{o2}件承認, #{o3}件否認しました" 32 redirect_to user_url(params[:user_id]) 33 end 34 rescue ActiveRecord::RecordInvalid 35 flash[:danger] = "無効な入力データがあった為、更新をキャンセルしました。" 36 redirect_to edit_overtime_notice_user_attendance_url(@user,item) 37 end 38 39

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

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

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

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

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

guest

回答2

0

もうひとつ問題があります
if (item[:change] == "1") && a || b || c
の部分。

if (item[:change] == "1") && ( a || b || c )

にしないと。

投稿2020/10/25 03:34

winterboum

総合スコア23567

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

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

zoff77

2020/10/25 03:59

かっこですかね?? 8行目ですか?ご指摘のように(item[:indicater_reply] == "なし" || item[:indicater_reply] == "承認" || item[:indicater_reply] == "否認")なので()はついていますが、他の部分ですか?
winterboum

2020/10/25 04:01

あ、ごめんなさい。錯覚してました。
guest

0

ベストアンサー

なぜ、例外のエラーに飛ばないのかがわかりません。

逆に「なぜ例外に飛ぶ」と思ったのでしょうか?条件に当たらない場合、単に処理をしないだけで、例外を起こす要素はないかと思います。

投稿2020/10/24 23:03

maisumakun

総合スコア146018

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

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

zoff77

2020/10/25 02:29

そうなんですね。例外処理 = エラーに飛ぶと思っていました。 「申請中」でupdateしたらエラーを出すにはどうしたら良いでしょうか?
maisumakun

2020/10/25 02:31

モデルにそのようなバリデーションを書いてください。
zoff77

2020/10/25 04:58

検討したのですが、コードがうまく書けませんでした。 カスタムメソッド def check_indicater_reply if change == "1" && indicater_reply == "申請中" errors.add(:indicater_reply, "申請内容を決定して下さい") end を書き、validate :check_indicater_reply, on: :update_overtime_notice にしましたが変わりなしでした。。。。 申し訳ないですが、術を教えてもらえないでしょうか。 因みに、セレクトはenumをs使っています
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問