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

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

ただいまの
回答率

87.48%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 361

score 19

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

def overtime_params

      params.require(:attendance).permit(:overtime_finished_at, :tomorrow, :overtime_work,:indicater_check,:indicater_check_superior)
    end

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

イメージ説明

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

<div class="modal-body">
      <%= form_with(model: @user, url: "#" , method: :patch , local: true) do |f| %>
        <% @attendances.each do |id, attendance|%>
          <% user = User.find(id) %>
          <h3 align="center" class="modal-title"><%= "【#{user.name}からの残業申請】" %></h3>

          <table class="table table-bordered table-condensed overtime_notice-table">

            <thead class="overtime_notice">
              <th>日付</th>
              <th>曜日</th>
              <th>終了予定時間</th>
              <th>指定勤務終了時間</th>
              <th>時間外時間</th>
              <th>業務処理内容</th>
              <th>指示者確認
                <div class="maru size_small black">       
                  <div class="letter3"></div>
                </div> 
              </th>
              <th>変更</th>
              <th>勤務を確認する</th>
            </thead>

            <% attendance.each do |day| %>
              <%= f.fields_for "attendance[]", day do |d| %>

                <tbody class="line">
                  <% css_class = 
                  case $days_of_the_week[day.worked_on.wday]
                    when '土'
                      'text-primary'
                    when '日'
                      'text-danger'
                    end
                    %>
                  <td><%= l(day.worked_on, format: :short) %></td>
                  <td class="<%= css_class %>"><%= $days_of_the_week[day.worked_on.wday] %></td>
                  <td><%= day.overtime_finished_at.try(:strftime,"%H:%M") %></td>
                  <td><%= format_basic_info(user.designation_work_end_time) %></td>
                  <td><%= overtime_worked_on(day.overtime_finished_at, user.designation_work_end_time, day.tomorrow) %></td>
                  <td><%= day.overtime_work %></td>
                  <td><%= d.select :indicater_reply ,{'なし':1, '申請中':2, '承認':3, '否認':4}, { prompt: false}, { class: 'form-control input-sm'} %></td>
                  <td><%= d.check_box :change,id: "change" %></td>
                  <td><%= link_to "確認", verifacation_user_path(user.id, worked_on: day.worked_on), class: "btn btn-primary" %></td>
                </tbody>

              <% end %>
            <% end %>
          </table>
          <div class="center">
            <%= f.submit "変更を送信する", class: "btn btn-primary" %>
          </div>
        <% end %>
      <% end %>
    </div>
  </div>
</div>
create_table "attendances", force: :cascade do |t|
    t.date "worked_on"
    t.time "started_at"
    t.time "finished_at"
    t.string "note"
    t.integer "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.datetime "overtime_finished_at"
    t.boolean "tomorrow", default: false
    t.string "overtime_work"
    t.string "indicater_check"
    t.string "indicater_check_superior"
    t.string "indicater_reply"
    t.boolean "change"
    t.boolean "verification"
    t.index ["user_id"], name: "index_attendances_on_user_id"
  end
class AttendancesController < ApplicationController

  before_action :set_user, only: [:edit_one_month]
  before_action :logged_in_user, only: [:update, :edit_one_month]
  before_action :admin_user, only: [:index,:destroy,:edit_basic_info]
  before_action :set_one_month, only: [:edit_one_month]

  UPDATE_ERROR_MSG = "勤怠登録に失敗しました。やり直してください。"


  # 申請お知らせモーダル

  def edit_overtime_notice
    @user = User.find(params[:user_id])
    @attendances = Attendance.where(indicater_check_superior: "申請中", indicater_check: @user.name).order(:user_id, :worked_on).group_by(&:user_id)
  end


# お知らせモーダル更新
  def update_overtime_notice
  end 




# 申請モーダル
  def edit_overtime_request
    @user = User.find(params[:user_id])
    @attendance = Attendance.find(params[:id])
    @superior = User.where(superior: true).where.not( id: current_user.id )
  end


  def update_overtime_request
    @user = User.find(params[:user_id])
    @attendance = Attendance.find(params[:id])
    if @attendance.update_attributes(overtime_params)
      flash[:success] = "残業申請を受け付けました"
      redirect_to user_url(@user)
    end  
  end



  def update
    @user = User.find(params[:user_id])
    @attendance = Attendance.find(params[:id])
    if @attendance.started_at.nil?
      if @attendance.update_attributes(started_at: Time.current.change(sec: 0))
        flash[:info] = "おはようございます!"
      else
        flash[:danger] = UPDATE_ERROR_MSG
      end
    elsif @attendance.finished_at.nil?
      if @attendance.update_attributes(finished_at: Time.current.change(sec: 0))
        flash[:info] = "お疲れ様でした。"
      else
        flash[:danger] = UPDATE_ERROR_MSG
      end
    end
    redirect_to @user
  end

  def edit_one_month
  end 

  def update_one_month
    ActiveRecord::Base.transaction do # トランザクションを開始します。
      attendances_params.each do |id, item|
        attendance = Attendance.find(id)
        attendance.update_attributes!(item)
      end
    end
    flash[:success] = "1ヶ月分の勤怠情報を更新しました。"
    redirect_to user_url(date: params[:date])
  rescue ActiveRecord::RecordInvalid # トランザクションによるエラーの分岐です。
    flash[:danger] = "無効な入力データがあった為、更新をキャンセルしました。"
    redirect_to attendances_edit_one_month_user_url(date: params[:date])
  end







private
    # 1ヶ月分の勤怠情報を扱います。
    def attendances_params
      params.require(:user).permit(attendances: [:started_at, :finished_at, :note])[:attendances]
    end


    # 申請モーダルの情報
    def overtime_params
      params.require(:attendance).permit(:overtime_finished_at, :tomorrow, :overtime_work,:indicater_check,:indicater_check_superior)
    end

    # 申請お知らせモーダルの情報
    def overtime_notice_params
      params.require(:attendance).permit(:indicater_reply, :change, :verification, :indicater_check_superior)
    end





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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • no1knows

    2020/10/18 10:06

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

    キャンセル

  • zoff77

    2020/10/18 16:37

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

    キャンセル

回答 1

checkベストアンサー

0

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/10/18 18:43

    方針としてはwinterboumさんと同じなので補足させていただきます。

    > 指示者確認で「なし」と選択すると、Aのユーザーの申請自体がなかったことにしたいので、
    送ったパラメーターをnilにして、上記のモーダルを消したいです。

    ということですが、データの持ち方などを考えると登録済みのレコードのindicater_replyカラムを4にする形が適切な流れかと思います。

    上記を前提として、UI側を考えると下記2つの選択肢が良いかと思いますがいかがでしょうか?

    ①「なし」にして「変更を送信する」ボタンを押したら、モーダルが消える。
    ② 申請を取り消すボタンを各行に追加する。
    (もし、「なし」を選択⇒「変更を送信する」ボタンを押す⇒モーダルが消えるという流れが手間だと考えているのであれば・・・)

    キャンセル

  • 2020/10/19 14:11

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

    キャンセル

  • 2020/10/19 14:38

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

    キャンセル

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る