前書き
変更前
Parameters: {"authenticity_token"="[FILTERED]", "weekly_goal"=>"ダイエット", "start_time"=>"2023-09-21", "monthly_goal_id"=>"1", "user_id"=>"1", "commit"=>"登録", "id"=>"1"}
↓.
変更後
Parameters : {"authenticity_token"=>"[FILTERED]", "weekly_goal"=>{"weekly_goal"=>"卵", "start_time"=>"2023-09-23", "monthly_goal_id"=>"1", "user_id"=>"1"}, "commit"=>"登録", "controller"=>"weekly_goals", "action"=>"create", "id"=>"1"}.
form_withのフォームデータを送信してコントローラーでparamsで受け取る際にweekly_goalというkeyで送信されたデータを扱いたかったのですがなかなか変更後のようにweekly_goalというkeyでデータを扱えなかったので記事に残します。
結論
⇨scope: :(データを登録したい)モデル名をform_withに追加する
<%= form_with model:@weekly_goal,scope: :weekly_goal do |f| %> <%= f.label :weekly_goal,"週間目標" ,class: "control-label" %> <%= f.text_field :weekly_goal ,class: "form-control" %> <%= f.label :start_time,"日付" ,class: "control-label" %> <%= f.date_field :start_time ,class: "form-control" %> <%= f.hidden_field :monthly_goal_id, value: @monthly_goal.user_id ,class: "form-control" %> <%= f.hidden_field :user_id, value: @user.id ,class: "form-control" %> <div class="modal-footer"> <%= button_to "閉じる", "#", type: "button", class: "btn btn-default ",data: { dismiss: "modal" } %> <%= f.submit "登録",class: "btn btn-primary" %> <% end %>
そもそもなんでweekly_goalというkeyを使いたかったのか?
↓のようなデータをフォームで送信すると
Parameters: {"authenticity_token"="[FILTERED]", "weekly_goal"=>"ダイエット", "start_time"=>"2023-09-21", "monthly_goal_id"=>"1", "user_id"=>"1", "commit"=>"登録", "id"=>"1"}
↓のようなエラーが出ました
Parameters: {"authenticity_token"=>"[FILTERED]", "weekly_goal"=>"ダイエット", "start_time"=>"2023-09-21", "monthly_goal_id"=>"1", "user_id"=>"1", "commit"=>"登録", "id"=>"1"} Unpermitted parameters: :authenticity_token, :commit, :id
これはストロングパラメーターにauthenticity_token, :commit, :idこの3つのカラムが含まれていないのでこのエラーが出ました。
def weekly_goal_params params.permit(:weekly_goal, :start_time, :user_id, :monthly_goal_id) end
だったのでこの3つの(authenticity_token, :commit, :id)カラムとフォームのparamsのデータを分けたいと思いました。 scope:オプションを指定すると↑を満たすことができエラー解決できました。