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

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

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

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

Q&A

1回答

330閲覧

一括入力時の日付入力値とパラメーターが異なる問題を解決したい

rinaly

総合スコア1

Ruby on Rails 5

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

0グッド

0クリップ

投稿2022/12/02 04:29

前提

勤怠アプリを制作中です。
ひと月分のスタッフのシフトを一括登録したいのですが
シフト日付のパラメータが全て「月末」になってしまい、入力値とずれてしまいます。

実現したいこと

ひと月分のスタッフのシフトを一括登録
日付の入力値とパラメーターを一致させたい。

発生している問題・エラーメッセージ

エラーメッセージはありません。
ひと月分のシフトの日付が全て月末として登録されてしまいます。

該当のソースコード

html.erb

1<%= form_with(model: @form, url: works_path, method: :post, local: true) do |f| %> 2 <table> 3 <%= f.fields_for :works do |w| %> 4 <% @next_month.each do |d| %> 5 <%= w.hidden_field :user_id, value: @user %> 6 <tr> 7 <td> 8 <%= w.date_field :shift, value: d %> 9 </td> 10 <td> 11 <%= w.select :worktype, Work.worktypes.keys.map {|k| [k,k]} %> 12 </td> 13 </tr> 14 <% end %> 15 <% end %> 16 <%= f.submit "送信" %> 17 </table> 18 <% end %>

Ruby

1#コントローラー 2 3def new 4 @form = Form::WorkCollection.new 5 now = Date.current 6 @next_month = (now.beginning_of_month.next_month..now.end_of_month.next_month).to_a 7 end 8 9def create 10 @form = Form::WorkCollection.new(work_collection_params) 11 @user = params[:user_id] 12 if @form.save 13 flash[:success] = 'シフトを登録しました' 14 redirect_to works_path 15 else 16 flash.now[:failed] = "シフトの登録に失敗しました" 17 render :index 18 end 19end 20 21def work_collection_params 22 params.require(:form_work_collection) 23 .permit(works_attributes: [:shift, :user_id, :worktype]) 24 end 25

Ruby

1#コレクション 2class Form::WorkCollection < Form::Base 3 FORM_COUNT = 31 #ここで、作成したい登録フォームの数を指定 4 attr_accessor :works 5 6 def initialize(attributes = {}) 7 super attributes 8 self.works = FORM_COUNT.times.map { Work.new() } unless self.works.present? 9 end 10 11 def works_attributes=(attributes) 12 self.works = attributes.map { |_, v| Work.new(v) } 13 end 14 15 def save 16 Work.transaction do 17 self.works.map do |work| 18 work.save! 19 end 20 end 21 end 22end

試したこと

タイムゾーンなどは設定済みです。
Viewでは正常に日付が入力されてます。
検証ツールで確認しましたが、こちらも値は問題なく表示されています。

html

1<input value="2023-01-04" type="date" name="form_work_collection[works_attributes][0][shift]" id="form_work_collection_works_attributes_0_shift">

上記のまま、登録ボタンを押すとパラメーターが以下のようになってしまいます。

parameters

1"form_work_collection"=> 2 {"works_attributes"=> 3 {"0"=>{"user_id"=>"", "shift"=>"2023-01-31", "worktype"=>"出勤予定"}, 4 "1"=>{"user_id"=>"", "shift"=>"2023-01-31", "worktype"=>"出勤予定"}, 5 "2"=>{"user_id"=>"", "shift"=>"2023-01-31", "worktype"=>"出勤予定"}, 6 "3"=>{"user_id"=>"", "shift"=>"2023-01-31", "worktype"=>"出勤予定"}, 7 "4"=>{"user_id"=>"", "shift"=>"2023-01-31", "worktype"=>"出勤予定"}, 8 "5"=>{"user_id"=>"", "shift"=>"2023-01-31", "worktype"=>"出勤予定"}, 9 "6"=>{"user_id"=>"", "shift"=>"2023-01-31", "worktype"=>"出勤予定"}, 10 "7"=>{"user_id"=>"", "shift"=>"2023-01-31", "worktype"=>"出勤予定"}, 11 "8"=>{"user_id"=>"", "shift"=>"2023-01-31", "worktype"=>"出勤予定"}, 12 "9"=>{"user_id"=>"", "shift"=>"2023-01-31", "worktype"=>"出勤予定"}, 13 "10"=>{"user_id"=>"", "shift"=>"2023-01-31", "worktype"=>"出勤予定"}, 14 ...

補足情報(FW/ツールのバージョンなど)

まだまだ勉強不足で、初歩的な内容かもしれませんが、わかる方いましたら、ご教示お願いします。

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

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

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

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

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

yuma.inaura

2022/12/02 10:09

form ではどんなHTMLが生成されてるんでしょうか?
rinaly

2022/12/03 01:16

ありがとうございます! 以下の通りです。 よろしくお願いします! ----------------------------------- <form action="/works" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="✓"><input type="hidden" name="authenticity_token" value="KL5V4tDHgdYWowzQVR+MZvREUVdqb28duVYdjBHB6S5xvsseekVvkfNKGFbtJo/dSNAG2SZE8eviOkWowDHoFA=="> <input type="submit" name="commit" value="送信" data-disable-with="送信"> <table> <input type="hidden" name="form_work_collection[works_attributes][0][user_id]" id="form_work_collection_works_attributes_0_user_id"> <tbody> <tr> <td> <input value="2023-01-01" type="date" name="form_work_collection[works_attributes][0][shift]" id="form_work_collection_works_attributes_0_shift"> </td> <td> <select name="form_work_collection[works_attributes][0][worktype]" id="form_work_collection_works_attributes_0_worktype"><option selected="selected" value="出勤予定">出勤予定</option> <option value="公休">公休</option> <option value="欠勤">欠勤</option> <option value="有給">有給</option></select> </td> </tr> <input type="hidden" name="form_work_collection[works_attributes][0][user_id]" id="form_work_collection_works_attributes_0_user_id"> <tr> <td> <input value="2023-01-02" type="date" name="form_work_collection[works_attributes][0][shift]" id="form_work_collection_works_attributes_0_shift"> </td> <td> <select name="form_work_collection[works_attributes][0][worktype]" id="form_work_collection_works_attributes_0_worktype"><option selected="selected" value="出勤予定">出勤予定</option> <option value="公休">公休</option> <option value="欠勤">欠勤</option> <option value="有給">有給</option></select> </td> </tr> <input type="hidden" name="form_work_collection[works_attributes][0][user_id]" id="form_work_collection_works_attributes_0_user_id"> <tr> <td> <input value="2023-01-03" type="date" name="form_work_collection[works_attributes][0][shift]" id="form_work_collection_works_attributes_0_shift"> ---------------
guest

回答1

0

<%= w.date_field :shift, value: d %> が作る html のところをよく見てください。
どの日付のところも name="form_work_collection[works_attributes][0][shift]" になっていませんか?([0]のところは人によりかわりますが)
同じ name が複数あるとき、form が送る情報は 一番最後のものを贈ります。
なのでいつも 最後の日付だけになります。
日によって nameが変わるようにしなければなりません。

あと、@next_month という命名良くないですね。@next_month なのに each ??? としばらる戸惑ってました。
@next_month_days とでもすべきでしょう
それと now.end_of_month.next_month だと 3/28 とか 5/30 とかになりませんか? now.next_month.end_of_month でしょう。

で、
「日によって nameが変わるように」は f.fields_for に続いてさらに w.fields_for なのかな、それでうまく行くかどうかはわかりません。

投稿2022/12/03 05:09

編集2022/12/03 05:16
winterboum

総合スコア23324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問