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

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

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

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

Q&A

解決済

1回答

1323閲覧

受け取ったパラメータをnilで更新したいです

zoff77

総合スコア19

Ruby on Rails 5

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

0グッド

0クリップ

投稿2020/10/17 14:18

編集2020/10/18 07:27

AのユーザーがBのユーザーに下記のパラメーターを送り(申請)
受け取ったBのユーザーが

rb

1def overtime_params 2 3 params.require(:attendance).permit(:overtime_finished_at, :tomorrow, :overtime_work,:indicater_check,:indicater_check_superior) 4 end

受け取ったBのユーザーが、下記のモーダルにて確認を押して確認を押して内容を知らせるとい機能です。

イメージ説明

指示者確認で「なし」と選択すると、Aのユーザーの申請自体がなかったことにしたいので、
送ったパラメーターをnilにして、上記のモーダルを消したいです。
考えたのですが、そのようなロジックが思いつきませんので、方法を教えて欲しいです。

erb

1<div class="modal-body"> 2 <%= form_with(model: @user, url: "#" , method: :patch , local: true) do |f| %> 3 <% @attendances.each do |id, attendance|%> 4 <% user = User.find(id) %> 5 <h3 align="center" class="modal-title"><%= "【#{user.name}からの残業申請】" %></h3> 6 7 <table class="table table-bordered table-condensed overtime_notice-table"> 8 9 <thead class="overtime_notice"> 10 <th>日付</th> 11 <th>曜日</th> 12 <th>終了予定時間</th> 13 <th>指定勤務終了時間</th> 14 <th>時間外時間</th> 15 <th>業務処理内容</th> 16 <th>指示者確認 17 <div class="maru size_small black"> 18 <div class="letter3"></div> 19 </div> 20 </th> 21 <th>変更</th> 22 <th>勤務を確認する</th> 23 </thead> 24 25 <% attendance.each do |day| %> 26 <%= f.fields_for "attendance[]", day do |d| %> 27 28 <tbody class="line"> 29 <% css_class = 30 case $days_of_the_week[day.worked_on.wday] 31 when '土' 32 'text-primary' 33 when '日' 34 'text-danger' 35 end 36 %> 37 <td><%= l(day.worked_on, format: :short) %></td> 38 <td class="<%= css_class %>"><%= $days_of_the_week[day.worked_on.wday] %></td> 39 <td><%= day.overtime_finished_at.try(:strftime,"%H:%M") %></td> 40 <td><%= format_basic_info(user.designation_work_end_time) %></td> 41 <td><%= overtime_worked_on(day.overtime_finished_at, user.designation_work_end_time, day.tomorrow) %></td> 42 <td><%= day.overtime_work %></td> 43 <td><%= d.select :indicater_reply ,{'なし':1, '申請中':2, '承認':3, '否認':4}, { prompt: false}, { class: 'form-control input-sm'} %></td> 44 <td><%= d.check_box :change,id: "change" %></td> 45 <td><%= link_to "確認", verifacation_user_path(user.id, worked_on: day.worked_on), class: "btn btn-primary" %></td> 46 </tbody> 47 48 <% end %> 49 <% end %> 50 </table> 51 <div class="center"> 52 <%= f.submit "変更を送信する", class: "btn btn-primary" %> 53 </div> 54 <% end %> 55 <% end %> 56 </div> 57 </div> 58</div>

rb

1create_table "attendances", force: :cascade do |t| 2 t.date "worked_on" 3 t.time "started_at" 4 t.time "finished_at" 5 t.string "note" 6 t.integer "user_id" 7 t.datetime "created_at", null: false 8 t.datetime "updated_at", null: false 9 t.datetime "overtime_finished_at" 10 t.boolean "tomorrow", default: false 11 t.string "overtime_work" 12 t.string "indicater_check" 13 t.string "indicater_check_superior" 14 t.string "indicater_reply" 15 t.boolean "change" 16 t.boolean "verification" 17 t.index ["user_id"], name: "index_attendances_on_user_id" 18 end

rb

1class AttendancesController < ApplicationController 2 3 before_action :set_user, only: [:edit_one_month] 4 before_action :logged_in_user, only: [:update, :edit_one_month] 5 before_action :admin_user, only: [:index,:destroy,:edit_basic_info] 6 before_action :set_one_month, only: [:edit_one_month] 7 8 UPDATE_ERROR_MSG = "勤怠登録に失敗しました。やり直してください。" 9 10 11 # 申請お知らせモーダル 12 13 def edit_overtime_notice 14 @user = User.find(params[:user_id]) 15 @attendances = Attendance.where(indicater_check_superior: "申請中", indicater_check: @user.name).order(:user_id, :worked_on).group_by(&:user_id) 16 end 17 18 19# お知らせモーダル更新 20 def update_overtime_notice 21 end 22 23 24 25 26# 申請モーダル 27 def edit_overtime_request 28 @user = User.find(params[:user_id]) 29 @attendance = Attendance.find(params[:id]) 30 @superior = User.where(superior: true).where.not( id: current_user.id ) 31 end 32 33 34 def update_overtime_request 35 @user = User.find(params[:user_id]) 36 @attendance = Attendance.find(params[:id]) 37 if @attendance.update_attributes(overtime_params) 38 flash[:success] = "残業申請を受け付けました" 39 redirect_to user_url(@user) 40 end 41 end 42 43 44 45 def update 46 @user = User.find(params[:user_id]) 47 @attendance = Attendance.find(params[:id]) 48 if @attendance.started_at.nil? 49 if @attendance.update_attributes(started_at: Time.current.change(sec: 0)) 50 flash[:info] = "おはようございます!" 51 else 52 flash[:danger] = UPDATE_ERROR_MSG 53 end 54 elsif @attendance.finished_at.nil? 55 if @attendance.update_attributes(finished_at: Time.current.change(sec: 0)) 56 flash[:info] = "お疲れ様でした。" 57 else 58 flash[:danger] = UPDATE_ERROR_MSG 59 end 60 end 61 redirect_to @user 62 end 63 64 def edit_one_month 65 end 66 67 def update_one_month 68 ActiveRecord::Base.transaction do # トランザクションを開始します。 69 attendances_params.each do |id, item| 70 attendance = Attendance.find(id) 71 attendance.update_attributes!(item) 72 end 73 end 74 flash[:success] = "1ヶ月分の勤怠情報を更新しました。" 75 redirect_to user_url(date: params[:date]) 76 rescue ActiveRecord::RecordInvalid # トランザクションによるエラーの分岐です。 77 flash[:danger] = "無効な入力データがあった為、更新をキャンセルしました。" 78 redirect_to attendances_edit_one_month_user_url(date: params[:date]) 79 end 80 81 82 83 84 85 86 87private 88 # 1ヶ月分の勤怠情報を扱います。 89 def attendances_params 90 params.require(:user).permit(attendances: [:started_at, :finished_at, :note])[:attendances] 91 end 92 93 94 # 申請モーダルの情報 95 def overtime_params 96 params.require(:attendance).permit(:overtime_finished_at, :tomorrow, :overtime_work,:indicater_check,:indicater_check_superior) 97 end 98 99 # 申請お知らせモーダルの情報 100 def overtime_notice_params 101 params.require(:attendance).permit(:indicater_reply, :change, :verification, :indicater_check_superior) 102 end 103 104 105 106 107 108 end 109

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

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

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

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

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

no1knows

2020/10/18 01:06

> 指示者確認で「なし」と選択すると、Aのユーザーの申請自体がなかったことにしたい とは、申請を削除するということでしょうか? またコントローラーはすべて記載ください。
zoff77

2020/10/18 07:37

はい。選択肢には「なし」「申請中」「承認」「拒否」があり、「なし」は申請自体をなかったことし、取り消すという動きです。よって、申請したユーザーが送ったパラメーターをnilで更新すれば良いと考えましたが、消去でも同じですよね? コントローラーすいませんでした。。。
guest

回答1

0

ベストアンサー

変更を送信 したらモーダルは消えるのでしょうから、なし にして送信したら何もせずに戻ったら?

サーバーに戻すのがいやでしたら、indicater_reply の on change を拾って、そこが なし な行をクリアするというJSを書くことになります。

あ。もしかして、入力データをクリアしたあたいでDBも修正するのでしょうか?
ですと「何もせずに」ではなくて params上のその人のデータをclearすることになりますね。

投稿2020/10/18 04:12

編集2020/10/18 04:15
winterboum

総合スコア23347

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

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

no1knows

2020/10/18 09:43

方針としてはwinterboumさんと同じなので補足させていただきます。 > 指示者確認で「なし」と選択すると、Aのユーザーの申請自体がなかったことにしたいので、 送ったパラメーターをnilにして、上記のモーダルを消したいです。 ということですが、データの持ち方などを考えると登録済みのレコードのindicater_replyカラムを4にする形が適切な流れかと思います。 上記を前提として、UI側を考えると下記2つの選択肢が良いかと思いますがいかがでしょうか? ①「なし」にして「変更を送信する」ボタンを押したら、モーダルが消える。 ② 申請を取り消すボタンを各行に追加する。 (もし、「なし」を選択⇒「変更を送信する」ボタンを押す⇒モーダルが消えるという流れが手間だと考えているのであれば・・・)
zoff77

2020/10/19 05:11

ありがとうございます! ①がイメージ通りですので、一度試してみます!! ありがとうございました
no1knows

2020/10/19 05:38

ごめんなさい。なしと拒否がごっちゃになっていました。 違いがよく理解できていませんが・・・①のような形で実装いただければと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問