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

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

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

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

Q&A

解決済

2回答

457閲覧

[Rails] collection_check_boxesを使用し、ユーザー情報と過去の旅行先データを紐付けて保存・編集できる機能を実装したい

ksmj

総合スコア1

Ruby on Rails 6

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

0グッド

0クリップ

投稿2023/02/14 08:10

実現したいこと

ログイン中のユーザーが訪問した都道府県を登録できる機能を実装したい。(チェックボックス使用。)

前提

Ruby on Railsで旅行系アプリを作成中。

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

ユーザーがログイン状態で都道府県チェックボックスにチェックを入れて更新ボタンを押すと「userのパラメータが空です」とメッセージが現れました。パラメータ内にはuserのid(=1)が含まれているので、問題なくユーザーIDがパラメータで送信されてきていると思ったのですが、ちゃんと情報が送れていないみたいです。
また、user_controllerのrequire(:user)の記述を削除すればエラーは消えるものの、更新してもデータは保存され無い状態です。
どのようにコードを記述すれば、現在ログイン中のユーザー情報と過去の旅行先情報を紐付けて保存できるか教えていただきたいです。初学者の為、至らない点が多々あると思いますが、ご教示の程宜しくお願いいたします。

error_message

1param is missing or the value is empty: user 2 3parameter 4{"_method"=>"patch", 5 "authenticity_token"=>"NVGzacdFNs7Z8w6eRlgIIgxAz8Zq3XlXAuetElnuf9K8rKqq7U5aOtPSOlkuMJPswJ1siHJnPdAXt+8GA7BmWg==", 6 "history"=>{"history_ids"=>["1", "2", "3"]}, 7 "commit"=>"UPDATE", 8 "id"=>"1"}

該当のソースコード

routes.rb

1Rails.application.routes.draw do 2 devise_for :users 3 root to: 'destinations#index' 4 resources :destinations, only: [:index, :new, :create, :update] 5 resources :users ,only: [:edit, :update] 6end

models/user.rb

1class User < ApplicationRecord 2 3 devise :database_authenticatable, :registerable, 4 :recoverable, :rememberable, :validatable 5 6 has_many :destinations 7 has_many :user_histories 8 has_many :users, through: :user_histories 9 10end

models/history.rb

1class History < ApplicationRecord 2 has_many :user_histories 3 has_many :histories, through: :user_histories 4end

models/user_history.rb

1class UserHistory < ApplicationRecord 2 belongs_to :user 3 belongs_to :history 4end

users_controller.rb

1class UsersController < ApplicationController 2 3 def edit 4 @user = current_user 5 end 6 7 def update 8 current_user.update(user_params) 9 flash[:success] = "旅行先を更新しました。" 10 redirect_to edit_user_path(current_user.id) 11 end 12 13 private 14 15 def user_params 16 params.require(:user).permit(history_ids: []) 17 end 18 19 20end

views/users/history.html.rb

1<div class="user-main"> 2 <div class="user-container"> 3 <div class="history"> 4 <h2>これまでの旅行先</h2> 5 </div> 6 <%= form_with model: @user, url: user_path(@user), method: :patch, local: true do |f| %> 7 <div class="prefecture-check-box"> 8 <div class="check-box-details"> 9 <%= collection_check_boxes :history, :history_ids, History.all, :id, :name, include_hidden: false do |history| %> 10 <%= history.check_box + history.text %> 11 <% end %> 12 </div> 13 </div> 14 <div class="save-btn"> 15 <%= f.submit "UPDATE", class: "update" %> 16 </div> 17 <% end %> 18 </div> 19</div>

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

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

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

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

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

guest

回答2

0

自己解決

そもそものアソシエーションの記述に誤りがあったことが原因でした。
userとhistoryのアソシエーションが組めていなかった為、色々と記述を書き換えてもユーザーに紐づいた情報を取得できなかったようです。
アソシエーションを修正した後に、<%= collection_check_boxes :user, :history_ids, History.all, :id, :name, include_hidden: false do |history| %>とビュー画面で記述したところ、無事に問題を解決することができました。
回答者様、助言をいただきありがとうございました。

投稿2023/02/15 02:36

ksmj

総合スコア1

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

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

0

controllerが {user: {history_ids: [ ] } } を待っているのに 送ってくるのが
{history: {history_ids: ["1", "2", "3"]}} だからです

投稿2023/02/14 08:17

winterboum

総合スコア23347

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

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

ksmj

2023/02/14 10:18

迅速なご回答ありがとうございます。 送信されてくる`{history: {history_ids: ["1", "2", "3"]}}`の最初のhistory部分をuserに変更するにはどのように記述を書き換えれば良いでしょうか。 collection_check_boxes内のhistoryの記述をuserに変更したりと修正して再トライしてみたのですが、解決できない状況です。お手数をお掛けし申し訳ありませんが、ご教示いただければ幸いです。
winterboum

2023/02/14 14:16

f.collection_check_boxes
ksmj

2023/02/15 02:31

ありがとうございます。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問