質問編集履歴
1
参考サイト変更、文法の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -32,30 +32,47 @@
|
|
32
32
|
|
33
33
|
また参考サイト様ではFamilyモデルを用意してのちにFamilyモデルとPetモデル(私の場合ではChildモデル予定)を紐づけるデータベース設計だったので、新たにFamilyモデルを追加しました。
|
34
34
|
|
35
|
-
しかし
|
35
|
+
しかし中間テーブルを含めた複数モデルでのデータ保存の方法を今ひとつ理解できておらず、質問させていただきました。
|
36
|
+
|
37
|
+
【追記】
|
38
|
+
コメントにて参考サイトの情報が古く理解の妨げになるとのご指摘をいただきまして、参考サイト様をRailsガイドへと変更させていただきました。
|
36
39
|
|
37
40
|
参考サイト様
|
38
|
-
https://rails
|
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
|
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]", "
|
48
|
-
|
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:1
|
51
|
-
User Exists? (
|
52
|
-
↳ app/controllers/admin/users_controller.rb:1
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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
|
-
|
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 =
|
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
|
-
|
110
|
+
end
|
103
111
|
|
104
|
-
|
112
|
+
private
|
105
113
|
|
106
114
|
def user_params
|
107
|
-
params.require(:
|
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 :
|
142
|
+
= g.hidden_field :family_id
|
135
143
|
|
136
144
|
= f.fields_for :family do |ff|
|
137
145
|
= ff.label :name
|