予約機能を考察しています。
□ userは1日単位で予約できるページと月単位でまとめて予約できる1ヶ月のページを持っている。(両ページは連携)
□ 両ページともにupdate処理
□ほとんどの場合、f.check_boxをtrueにする予想がされるカラムが存在する
■ 詰まっている内容
1ヶ月ページで、予約日分f.check_boxをtrueにするのは手間であると考え、checked:trueを付けました。
しかし、1日単位のページで同一のf.check_boxをfalseにしてupdateした場合、月のf.check_boxのchecked:trueによって、falseが受け取れません。
例:単一ページで3月1日のf.check_boxをfalseにして更新しても、1ヶ月ページの3月1日はchecked:trueによって、弾かれる。
erb
1 21ヶ月単位の予約ページ 3 4<%= form_with(model: resource, url: month_update_users_reception_path(date: @first_day), method: :patch, local: true) do |f| %> 5 <table class="table table-bordered"> 6 <thead> 7 <tr> 8 <th>申請</th> 9 <th>ご利用日</th> 10 <th style="width: 50px">曜日</th> 11 <th>迎え時間</th> 12 <th>迎え場所</th> 13 <th style="width: 100px"> 迎え有無</th> 14 <th>送り時間</th> 15 <th>送り場所</th> 16 <th style="width: 100px"> 送り有無</th> 17 <th style="width: 100px">イベント</th> 18 <th>備考</th> 19 </tr> 20 </thead> 21 <tbody> 22 <% @receptions.each do |day| %> 23 <%= f.fields_for "receptions[]", day do |r| %> 24 <% css_class = 25 case $days_of_the_week[day.date_of_use.wday] 26 when '土' 27 'text-primary' 28 when '日' 29 'text-danger' 30 end 31 %> 32 <tr> 33 <td><%= r.check_box :request, {checked: false, class: "sample"} %></td> 34 <td><%= l(day.date_of_use, format: :short) %></td> 35 <td class="<%= css_class %>"><%= $days_of_the_week[day.date_of_use.wday] %></td> 36 <td><%= r.time_field :start_time,{ max: "18:30", min: "08:30", class: "form-control input-sm" }%></td> 37 <td><%= r.select :start_place, [ ["自宅",1], ["学校 or 園", 2], ["祖父母宅", 3 ] ,["なし", 4]], {prompt: "迎え場所を選択"}, {class: "form-control input-sm" } %></td> 38 <td><%= r.check_box :start_transfer,{checked: true}, "true", "false" %></td> 39 ↑1ヶ月ページの問題となるカラム 40 <td><%= r.time_field :end_time,{ max: "18:30", min: "08:30", class: "form-control input-sm" } %></td> 41 <td><%= r.select :end_place, [ ["自宅",1], ["祖母宅", 2], ["その他", 3 ] ,["なし", 4]], {prompt: "送り場所を選択"}, {class: "form-control input-sm" } %></td> 42 <td><%= r.check_box :end_transfer,{checked: true}, "true", "false" %</td> 43 <td><%= r.check_box :event %></td> 44 <td><%= r.text_field :remarks, class: "form-control" %></td> 45 </tr> 46 <% end %> 47 <% end %> 48 </tbody> 49 </table> 50 <div class="table_modal"> 51 <%= link_to "戻る", user_path(current_user), class: "btn btn-default" %> 52 <%= f.submit "上記の内容で受付を申請", class: "btn btn-primary" %> 53 </div> 54 <% end %>
erb
1 <%= form_with( url: day_update_users_receptions_path, method: :patch, remote: true) do |f| %> 2 <table class="table table-bordered"> 3 <thead class="table_modal"> 4 <th>ご利用日</th> 5 <th>迎え時間</th> 6 <th>迎え場所</th> 7 <th style="width: 100px"> 迎え有無</th> 8 <th>送り時間</th> 9 <th>送り場所</th> 10 <th style="width: 100px"> 送り有無</th> 11 <th style="width: 100px">イベント</th> 12 <th>備考</th> 13 </thead> 14 <tbody class="table_modal"> 15 <td><%= f.date_field :date_of_use,{value: "", class: "form-control input-sm" ,required: true } %></td> 16 <td><%= f.time_field :start_time ,{ max: "18:30", min: "08:30", class: "form-control input-sm" ,required: true } %></td> 17 <td><%= f.select :start_place, [ ["自宅",1], ["学校 or 園", 2], ["祖父母宅", 3 ] ,["なし", 4]], {prompt: "迎え場所を選択"}, {class: "form-control input-sm" ,required: true } %></td> 18 <td><%= f.check_box :start_transfer,{checked: true}, "true", "false" %></td> 19 ↑1ヶ月ページの問題となるカラムと同様(ここをfalseにすると1ヶ月ページに反映されない) 20 <td><%= f.time_field :end_time ,{ max: "18:30", min: "08:30", class: "form-control input-sm" ,required: true } %></td> 21 <td><%= f.select :end_place, [ ["自宅",1], ["祖母宅", 2], ["その他", 3 ] ,["なし", 4]], {prompt: "送り場所を選択"}, {class: "form-control input-sm" ,required: true } %></td> 22 <td><%= f.check_box :end_transfer,{checked: true}, "true", "false" %></td> 23 <td><%= f.check_box :event,{checked: false}, "true", "false" %></td> 24 <td><%= f.text_field :remarks, class: "form-control" %></td> 25 </tbody> 26 </table> 27 <div class="table_modal"> 28 <%= f.submit "上記の内容で受付を申請", class: "btn btn-primary" %> 29 </div> 30 <% end %> 31
1日単位ページの処理 def day_edit @user = User.find(current_user.id) end def day_update @user = User.find(current_user.id) @reception = @user.receptions.find_by(date_of_use: params[:date_of_use]) respond_to do |format| if @reception.update(reception_params) flash[:notice] = "指定日の受付に成功しました" format.html { redirect_to @receprion } format.js { render js: "window.location = '#{current_user.id}'" } else format.html { render :_new } format.js { render :errors } end end end
1ヶ月単位ページの処理 def month_edit @first_day = params[:date].nil? ? Date.current.beginning_of_month : params[:date].to_date @last_day = @first_day.end_of_month one_month = [*@first_day..@last_day] @receptions = current_user.receptions.where(date_of_use: @first_day..@last_day).order("date_of_use ASC") unless one_month.count == @receptions.count ActiveRecord::Base.transaction do one_month.each { |day| current_user.receptions.create(date_of_use: day) } end @receptions = current_user.receptions.where(date_of_use: @first_day..@last_day).order("date_of_use ASC") end rescue ActiveRecord::RecordInvalid flash[:danger] = "ページ情報の取得に失敗しました、再アクセスしてください。" redirect_to root_url end @user = User.find(current_user.id) @contact = @user.contact @reception = @user.receptions.where.not(start_time: nil) end def month_update @user = User.find(current_user.id) ActiveRecord::Base.transaction do # 成功の数を入れる変数 r1 = 0 month_params.each do |id,item| reception = Reception.find(id) # 条件1 if item[:request] == "1" # 条件2 if item[:start_time].blank? && item[:end_time].blank? flash[:alert] = "空白の時間が見つかりました。" redirect_to @user and return elsif # 条件3 item[:start_place].blank? && item[:end_place].blank? flash[:alert] = "空白の場所が見つかりました。" redirect_to @user and return elsif # 条件4 item[:start_time] >= item[:end_time] flash[:alert] = "設定時間に誤りがあります" redirect_to @user and return end r1 += 1 reception.update!(item) end end if r1 > 0 flash[:notice] = "受付を#{r1}件申請しました" redirect_to @user else flash[:alert] = "「申請」にチェックを入れて下さい。" redirect_to @user and return end end rescue ActiveRecord::RecordInvalid flash[:alert] = "無効な入力データがあった為、更新をキャンセルしました。" edirect_to redirect_to @user end
1日ページの問題カラムをfalseにして更新したときのログ Started PATCH "/users/receptions/day_update" for 127.0.0.1 at 2021-03-04 23:37:50 +0900 Processing by Users::ReceptionsController#day_update as JS Parameters: {"utf8"=>"✓", "authenticity_token"=>"vFfWzg/NLsADn8C6dhokiUbeDluGP2+Dd2fp6vyqugU/cvkiWJnNHzIlAypJte/ecupIltmyz3BFCf+Za058ew==", "date_of_use"=>"2021-03-24", "start_time"=>"09:00", "start_place"=>"1", "start_transfer"=>"false", "end_time"=>"12:00", "end_place"=>"1", "end_transfer"=>"true", "event"=>"false", "remarks"=>"", "commit"=>"上記の内容で受付を申請"} ↑こちらのカラムです User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 4], ["LIMIT", 1]] ↳ app/controllers/users/receptions_controller.rb:10 User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 4], ["LIMIT", 1]] ↳ app/controllers/users/receptions_controller.rb:10 Reception Load (0.8ms) SELECT "receptions".* FROM "receptions" WHERE "receptions"."user_id" = ? AND "receptions"."date_of_use" = ? LIMIT ? [["user_id", 4], ["date_of_use", "2021-03-24"], ["LIMIT", 1]] ↳ app/controllers/users/receptions_controller.rb:11 Unpermitted parameters: :utf8, :_method, :authenticity_token, :commit (0.1ms) begin transaction ↳ app/controllers/users/receptions_controller.rb:13 Reception Update (0.6ms) UPDATE "receptions" SET "start_time" = ?, "end_time" = ?, "start_transfer" = ?, "end_transfer" = ?, "start_place" = ?, "end_place" = ?, "event" = ?, "remarks" = ?, "updated_at" = ? WHERE "receptions"."id" = ? [["start_time", "2000-01-01 09:00:00"], ["end_time", "2000-01-01 12:00:00"], ["start_transfer", 0], ["end_transfer", 1], ["start_place", "1"], ["end_place", "1"], ["event", 0], ["remarks", ""], ["updated_at", "2021-03-04 23:37:50.163148"], ["id", 24]] ↳ app/controllers/users/receptions_controller.rb:13 (1.0ms) commit transaction ↳ app/controllers/users/receptions_controller.rb:13 Completed 200 OK in 43ms (Views: 0.2ms | ActiveRecord: 4.2ms) ↑こちらのカラムです
def reception_params params.permit(:date_of_use, :start_time, :end_time, :start_transfer, :end_transfer, :start_place, :end_place, :event, :remarks)
恐らく、他の方法があるのでは無いかと思いますが、知識不足ゆえに解決できません。
お忙しい中、恐れ入りますが教えて下さい。
logをそこだけでなく Startedから次のStartedまで載せて。
及びプログラムがないとなんとも。controllerとviewを
お忙しい中、見ていただいたのに申し訳ございません。。。
只今修正させていただきました。
どこが重要なのか判断出来るなら、自力で解決できてます。
自力で解決できないのですから、どこが重要なのかの判断ができていないのです。
ので
部分的に載せていただいても解決できないことが多いです。
ここは要るだろうここは要らないだろうなどと判断しないで全部載せてください
お手数おかけしてしまい、申し訳ございません。
現在のコードに更に追加すると、文字数オーバーとなってしまいます。
上記の内容が該当とは思いますが、他に必要なファイルがあれば、修正させていただきます。
reception_params を見たい
承知いたしました。
文字制限にかからなかったので、下部に追加させて頂きました。
お手隙の時で構いませんので、宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー