ume

rails6 paramsオブジェクトを作成する方法

前書き

変更前

  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:オプションを指定すると↑を満たすことができエラー解決できました。