回答編集履歴

2

@booksを勘違いしていたので回答と解説を修正

2021/02/06 02:32

投稿

oakbow
oakbow

スコア227

test CHANGED
@@ -39,6 +39,8 @@
39
39
  redirect_to book_path(book.id)
40
40
 
41
41
  else
42
+
43
+ @books = Book.all
42
44
 
43
45
  render 'new'
44
46
 
@@ -88,8 +90,6 @@
88
90
 
89
91
 
90
92
 
91
- 多分試行錯誤したんでしょうけど else の下にある `@books = Book.new` も意味がないです。変数名が違うし、必要なのは空の Book インスタンスではなくて、入力内容を保持しているそれですからね。
92
-
93
93
 
94
94
 
95
95
  実は同じ問題は update アクションでも起こるはず。

1

修正内容を解説

2021/02/06 02:31

投稿

oakbow
oakbow

スコア227

test CHANGED
@@ -51,3 +51,51 @@
51
51
 
52
52
 
53
53
  これで直りませんでしょうか。
54
+
55
+
56
+
57
+ ---------
58
+
59
+
60
+
61
+ 解説しておきますね。
62
+
63
+
64
+
65
+ エラーメッセージ(ブラウザの翻訳機能を有効にしているんだと思いますが、質問するときはoffのものを貼った方が良いかもしれません)から、
66
+
67
+
68
+
69
+ ```
70
+
71
+ <% if @book.errors.any? %>
72
+
73
+ ```
74
+
75
+
76
+
77
+ の箇所で、 `@book` が nil になっているせいで発生しているエラーだということがわかります。
78
+
79
+ create アクションで new ビューを表示させているので、入力内容不備によるヴァリデーションエラーを出したい状況だとわかりますが、このときは `@book` に入力内容が保持されている必要があり、 nil になっているのはおかしいです。
80
+
81
+
82
+
83
+ で、んじゃ new ビューに `@book` を渡している create アクションの中身を見てみます。
84
+
85
+ 慣れている人だと一発で分かりますが、 `list_params` を受け取っているのはいいけどこれが単なるローカル変数になってます。これだと create アクション内部でしか有効じゃ無いので、new アクションに引き継がれません。
86
+
87
+ 正常系、つまり入力内容が正しくで正常にデータを登録できる場合はこれで動作しますが、異常系の場合は new ビューに必要な `@book` を初期化してないし値を渡してもいないので、エラーに繋がっています。
88
+
89
+
90
+
91
+ 多分試行錯誤したんでしょうけど else の下にある `@books = Book.new` も意味がないです。変数名が違うし、必要なのは空の Book インスタンスではなくて、入力内容を保持しているそれですからね。
92
+
93
+
94
+
95
+ 実は同じ問題は update アクションでも起こるはず。
96
+
97
+ こちらでも book -> @book にしておくと全く同じように解消できると思います。
98
+
99
+
100
+
101
+ 大丈夫だと思うんですが、これで直らなかったらまた言ってください。