質問編集履歴

1

参考サイト変更、文法の修正

2023/09/29 05:22

投稿

nanananan
nanananan

スコア7

test CHANGED
File without changes
test CHANGED
@@ -32,30 +32,47 @@
32
32
 
33
33
  また参考サイト様ではFamilyモデルを用意してのちにFamilyモデルとPetモデル(私の場合ではChildモデル予定)を紐づけるデータベース設計だったので、新たにFamilyモデルを追加しました。
34
34
 
35
- しかし私自身が中間テーブルを介してのデータ保存、また複数モデルでのデータ取得を1つの入力フォームにまとめる方法がわからず、下記サイト様を参考に中間テーブルも含めた複数モデルでのデータ保存仕様へ変更行いましたが、ユーザー自体は登録できるもののFamilyよびGroupモデルでのデータ保存はうまく実装でておりせん
35
+ しかし中間テーブルを含めた複数モデルでのデータ保存の方法今ひとつ理解できらず、質問させていただきました
36
+
37
+ 【追記】
38
+ コメントにて参考サイトの情報が古く理解の妨げになるとのご指摘をいただきまして、参考サイト様をRailsガイドへと変更させていただきました。
36
39
 
37
40
  参考サイト様
38
- https://rails.densan-labs.net/form/many_to_many_form.html
41
+ https://railsguides.jp/form_helpers.html#%E8%A4%87%E9%9B%91%E3%81%AA%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B
39
42
 
40
43
  ### 発生している問題・エラーメッセージ
41
- コンソール上で**Unpermitted parameters**とあることからストロングパラメータ内の問題により変更の許可ないことでは理解できました
44
+ コンソール上で**Unpermitted parameters**: :user_id, :group, :family.とあることからストロングパラメータ内の問題と理解しましたが、どのように変更すればいいわかっておりせん
42
45
 
43
- しかしその部をどのように変更すれば保存きる未だわかっておりません
46
+ またfamily_idというGroupモデルキーをどのように取得すればいいのか、入力フォームでの取り方自体まず間違っている点も問題だと考えておりま
44
47
 
48
+ ```terminal
45
- Started POST "/admin/users" for ::1 at 2023-09-29 08:05:09 +0900
49
+ Started POST "/admin/users" for ::1 at 2023-09-29 13:46:35 +0900
46
50
  Processing by Admin::UsersController#create as TURBO_STREAM
47
- Parameters: {"authenticity_token"=>"[FILTERED]", "form_user"=>{"name"=>"ユーザーE", "email"=>"e@example.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "user_id"=>"1", "group"=>{"group_id"=>""}, "family"=>{"name"=>"サンプル"}}, "commit"=>"登録する"}
48
- Unpermitted parameters: :user_id, :group, :family. Context: { controller: Admin::UsersController, action: create, request: #<ActionDispatch::Request:0x0000000108db56d8>, params: {"authenticity_token"=>"[FILTERED]", "form_user"=>{"name"=>"ユーザーE", "email"=>"e@example.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "user_id"=>"1", "group"=>{"group_id"=>""}, "family"=>{"name"=>"サンプル"}}, "commit"=>"登録する", "controller"=>"admin/users", "action"=>"create"} }
51
+ Parameters: {"authenticity_token"=>"[FILTERED]", "user"=>{"name"=>"ユーザーF", "email"=>"f@example.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "user_id"=>"1", "group"=>{"group_id"=>""}, "family"=>{"name"=>"サンプル"}}, "commit"=>"登録する"}
52
+
53
+ Unpermitted parameters: :user_id, :group, :family. Context: { controller: Admin::UsersController, action: create, request: #<ActionDispatch::Request:0x000000010dc2ec38>, params: {"authenticity_token"=>"[FILTERED]", "user"=>{"name"=>"ユーザーF", "email"=>"f@example.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "user_id"=>"1", "group"=>{"group_id"=>""}, "family"=>{"name"=>"サンプル"}}, "commit"=>"登録する", "controller"=>"admin/users", "action"=>"create"} }
49
54
  TRANSACTION (0.1ms) BEGIN
50
- ↳ app/controllers/admin/users_controller.rb:14:in `create'
51
- User Exists? (1.0ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2 [["email", "e@example.com"], ["LIMIT", 1]]
52
- ↳ app/controllers/admin/users_controller.rb:14:in `create'
53
- Form::User Create (0.8ms) INSERT INTO "users" ("name", "email", "password_digest", "created_at", "updated_at", "admin") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id" [["name", "ユーザーE"], ["email", "e@example.com"], ["password_digest", "[FILTERED]"], ["created_at", "2023-09-28 23:05:10.106250"], ["updated_at", "2023-09-28 23:05:10.106250"], ["admin", false]]
54
- app/controllers/admin/users_controller.rb:14:in `create'
55
- TRANSACTION (2.0ms) COMMIT
56
- app/controllers/admin/users_controller.rb:14:in `create'
55
+ ↳ app/controllers/admin/users_controller.rb:15:in `create'
56
+ User Exists? (0.7ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2 [["email", "f@example.com"], ["LIMIT", 1]]
57
+ ↳ app/controllers/admin/users_controller.rb:15:in `create'
58
+
59
+ TRANSACTION (0.1ms) ROLLBACK
60
+ app/controllers/admin/users_controller.rb:15:in `create'
61
+ Rendering layout layouts/application.html.slim
62
+ Rendering admin/users/new.html.slim within layouts/application
63
+ User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
64
+ ↳ app/controllers/application_controller.rb:8:in `current_user'
65
+ Rendered admin/users/_form.html.slim (Duration: 2.5ms | Allocations: 6987)
66
+ Rendered admin/users/new.html.slim within layouts/application (Duration: 2.6ms | Allocations: 7176)
67
+ CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
68
+ ↳ app/controllers/application_controller.rb:8:in `current_user'
69
+ Rendered layout layouts/application.html.slim (Duration: 5.9ms | Allocations: 14075)
70
+ Completed 422 Unprocessable Entity in 312ms (Views: 5.9ms | ActiveRecord: 10.4ms | Allocations: 30071)
71
+ ```
57
72
 
58
73
  ### 該当のソースコード
74
+ 【追記】参考サイト様の情報をもとに主にコントローラ周りを編集しましたが、バリデーションによるエラーメッセージとして、**Groups familyを入力してください**とusers#newビュー画面上に表示されている状況です。
75
+
59
76
  各種モデルアソシエーション設定
60
77
  ```app/models/famiry.rb
61
78
  class Family < ApplicationRecord
@@ -69,45 +86,37 @@
69
86
  belongs_to :user
70
87
  end
71
88
  ```
89
+ 【追加】userモデル内に、Familyモデルに関する**accepts_nested_attributes_for**の設定を追記しました。
72
90
  ```app/models/user.rb
73
91
  class User < ApplicationRecord
74
92
  has_many :groups, dependent: :destroy
75
93
  has_many :families, through: :groups, source: :family
76
94
  accepts_nested_attributes_for :groups, allow_destroy: true
77
- end
78
- ```
79
- ストロングパラメータ内設定
80
- ```app/models/form/user.rb
81
- class Form::User < User
82
- REGISTRABLE_ATTRIBUTES = %i(id name email password password_confirmation)
83
- has_many :group, class_name: 'Form::Group'
84
- end
85
- ```
86
- ```app/models/form/group.rb
87
- class Form::Group < Group
88
- REGISTRABLE_ATTRIBUTES = %i(id user_id family_id _destroy)
95
+ accepts_nested_attributes_for :families, allow_destroy: true
89
96
  end
90
97
  ```
91
98
  usersコントローラ
99
+ 【追加】ストロングパラメータ内設定を変更しました。
92
100
  ```app/controllers/users_controller.rb
93
101
  def create
94
- @user = Form::User.new(user_params)
102
+ @user = User.new(user_params)
103
+ @user.groups.build
104
+
95
105
  if @user.save
96
- # ユーザー登録完了メール送信処理を追加
97
- CoyellMailer.user_creation_email(@user).deliver_now
98
106
  redirect_to root_path, notice: "「#{@user.name}」さんを登録しました"
99
107
  else
100
108
  render :new, status: :unprocessable_entity
101
109
  end
102
- end
110
+ end
103
111
 
104
- private
112
+ private
105
113
 
106
114
  def user_params
107
- params.require(:form_user).permit(Form::User::REGISTRABLE_ATTRIBUTES + [groups_attributes: Form::Group::REGISTRABLE_ATTRIBUTES])
115
+ params.require(:user).permit(:name, :email, :password, :password_confirmation, groups_attributes: [:id, :user_id, :family_id], families_attributes: [:id, :name])
108
116
  end
109
117
  ```
110
118
  ユーザー新規登録時入力フォームビュー
119
+ 【追加】ネストした入力フォームのGroupモデルに関するhidden_field設定を変更しました。
111
120
  ```app/views/admin/users/_form.html.slim
112
121
  = form_with model: @user, url: admin_users_url, local: true do |f|
113
122
 
@@ -129,9 +138,8 @@
129
138
 
130
139
  = f.hidden_field :user_id, :value => current_user.id
131
140
 
132
- // groupモデルの入力フォームをネストしてデータ取得する
133
141
  = f.fields_for :group do |g|
134
- = g.hidden_field :group_id
142
+ = g.hidden_field :family_id
135
143
 
136
144
  = f.fields_for :family do |ff|
137
145
  = ff.label :name