teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

content_paramsの変更

2021/03/22 12:05

投稿

yoshi_10_11
yoshi_10_11

スコア241

answer CHANGED
@@ -72,4 +72,27 @@
72
72
 
73
73
  後者のほうはパスの別の書き方になります。上の方法がうまくいかなければお試しください。
74
74
 
75
- これで、次にどういったエラーが出るかまた確認したいです。よろしくお願いいたします。
75
+ これで、次にどういったエラーが出るかまた確認したいです。よろしくお願いいたします。
76
+
77
+
78
+ **>>>>>>>>>>>>>>追記の追記の追記 2021.3.22 21:30**
79
+ 前回の修正により次の課題がcontent_paramsのエラー解消となったみたいですので、
80
+
81
+ ```ruby
82
+ params.require(:content).permit(:detail,:bank_id,:category_id,:user_id).merge(category_id: category.id ,user_id: current_user.id)
83
+ ```
84
+
85
+ ```ruby
86
+ params.require(:content).permit(:detail).merge(bank_id: params[:bank_id], category_id: params[:category_id] ,user_id: current_user.id)
87
+ ```
88
+ に変更して見てください。これで登録できるようになるはず…
89
+
90
+ エラーコードに**Parameter**として
91
+ ```ruby
92
+ {"authenticity_token"=>"Tdl19kGEpFdkQQsgEFHAKhHV4ef1idrapjM73+whvV89uRcWbR2njvyCGwwn3cbU8sqFiwfgQWd8arMK8sdQMw==",
93
+ "content"=>{"detail"=>"5000"},
94
+ "commit"=>"登録",
95
+ "bank_id"=>"2",
96
+ "category_id"=>"1"}
97
+ ```
98
+ が記載されていたと思います。こちらがparamsの値の正体です。Railsを使い始めたばかりでparamsにどんな値が入っているのかわからない、という場合にはエラーを出した際にこちらの値を確認するとわかりやすいです。他の機能を実装する際の参考にしてみてください。

2

時刻を記入

2021/03/22 12:05

投稿

yoshi_10_11
yoshi_10_11

スコア241

answer CHANGED
@@ -16,7 +16,7 @@
16
16
  の部分は誤字ですかね?もし意図的に加えたものであるならば、外しておきましょう
17
17
 
18
18
 
19
- >>>>>>>>>追記
19
+ **>>>>>>>>>追記**
20
20
 
21
21
  has_many :contentsはあるのですね
22
22
 
@@ -47,7 +47,7 @@
47
47
  上記、一旦確認してみてください。お願いいたします。
48
48
 
49
49
 
50
- >>>>>>>>>>追記の追記
50
+ **>>>>>>>>>>追記の追記 2021.3.22 08:30**
51
51
 
52
52
  次のエラーが
53
53
  '''ruby

1

form_withのエラーに対して修正

2021/03/21 23:33

投稿

yoshi_10_11
yoshi_10_11

スコア241

answer CHANGED
@@ -13,4 +13,63 @@
13
13
  ```ruby
14
14
  ,Category.find(params[:category_id])
15
15
  ```
16
- の部分は誤字ですかね?もし意図的に加えたものであるならば、外しておきましょう
16
+ の部分は誤字ですかね?もし意図的に加えたものであるならば、外しておきましょう
17
+
18
+
19
+ >>>>>>>>>追記
20
+
21
+ has_many :contentsはあるのですね
22
+
23
+ new.html.erb
24
+ <%= form_with model: [@bank,@category,@content], class: 'form', local: true do |f| %>
25
+
26
+ <%= form_with model: @content, class: 'form', local: true do |f| %>
27
+
28
+
29
+ contents_controller.rb
30
+ ※testは不要なコードだとお見受けしたので省略
31
+ def create
32
+ @bank = Bank.find(params[:bank_id])
33
+ @content = @bank.contents.new(content_params)
34
+
35
+ 一旦、ここまで修正してエラーがどう変化するか見てみたいです。
36
+ おそらく、ここまで変更すると、残りはcontent_paramsをどうするか、という課題だけが残るかと思います。
37
+
38
+ 当初、
39
+ @bank = Bank.find(params[:bank_id]),Category.find(params[:category_id])
40
+ と書いていたので、@bankにはBankのオブジェクトだけでなくCategoryオブジェクトも入ってしまっていたため、@bankにはオブジェクトの配列ができてしまっていました。
41
+ その証拠にundefined methods contents for <Array xxxxxx....>とエラー文が示すように、Array(=配列)にはcontentsはないですよ、というエラーになってしまっています。
42
+
43
+ ので、一旦コードをスッキリさせるために、Bankだけを取得するように書いてみる、ということです。
44
+
45
+ form_withの修正については、modelに複数書くことに意味がないため削除した、という理由だけです。
46
+
47
+ 上記、一旦確認してみてください。お願いいたします。
48
+
49
+
50
+ >>>>>>>>>>追記の追記
51
+
52
+ 次のエラーが
53
+ '''ruby
54
+ undefined method `contents_path' for #<#<Class:0x00007fb61254a4f0>:0x00007fb61d13f8c8>
55
+ '''
56
+ ですね。
57
+ 次は
58
+ ```html
59
+ <%= form_with model: @content, url: bank_category_contents_path, class: 'form', local: true do |f| %>
60
+ ```
61
+ に直せばたぶんいけるんじゃないかなと思います。もしくは、
62
+ ```html
63
+ <%= form_with model: @content, url: [@bank, @category, :contents], method: :post, class: 'form', local: true do |f| %>
64
+ ```
65
+ かなぁ。
66
+
67
+ こちらはform_withで生成されたformのURLがルーティングで見つからないよ、というエラーです。
68
+ 今回のようにmodelに@contentと設定すると、contents_pathが自動で設定されるようになります。
69
+
70
+ しかし、routes.rbの設定を伺うと、contents_pathに該当するパスはなく、かつ、ご希望を叶えるとするならばbanks/id/categories/id/contentsのパスを生成しなければなりません。
71
+ そのため、別途urlオプションにURLパスを指定してあげる必要があります。
72
+
73
+ 後者のほうはパスの別の書き方になります。上の方法がうまくいかなければお試しください。
74
+
75
+ これで、次にどういったエラーが出るかまた確認したいです。よろしくお願いいたします。