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

回答編集履歴

2

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

2021/02/06 02:32

投稿

oakbow
oakbow

スコア227

answer CHANGED
@@ -19,6 +19,7 @@
19
19
  if @book.save
20
20
  redirect_to book_path(book.id)
21
21
  else
22
+ @books = Book.all
22
23
  render 'new'
23
24
  end
24
25
  end
@@ -43,7 +44,6 @@
43
44
  慣れている人だと一発で分かりますが、 `list_params` を受け取っているのはいいけどこれが単なるローカル変数になってます。これだと create アクション内部でしか有効じゃ無いので、new アクションに引き継がれません。
44
45
  正常系、つまり入力内容が正しくで正常にデータを登録できる場合はこれで動作しますが、異常系の場合は new ビューに必要な `@book` を初期化してないし値を渡してもいないので、エラーに繋がっています。
45
46
 
46
- 多分試行錯誤したんでしょうけど else の下にある `@books = Book.new` も意味がないです。変数名が違うし、必要なのは空の Book インスタンスではなくて、入力内容を保持しているそれですからね。
47
47
 
48
48
  実は同じ問題は update アクションでも起こるはず。
49
49
  こちらでも book -> @book にしておくと全く同じように解消できると思います。

1

修正内容を解説

2021/02/06 02:31

投稿

oakbow
oakbow

スコア227

answer CHANGED
@@ -24,4 +24,28 @@
24
24
  end
25
25
  ```
26
26
 
27
- これで直りませんでしょうか。
27
+ これで直りませんでしょうか。
28
+
29
+ ---------
30
+
31
+ 解説しておきますね。
32
+
33
+ エラーメッセージ(ブラウザの翻訳機能を有効にしているんだと思いますが、質問するときはoffのものを貼った方が良いかもしれません)から、
34
+
35
+ ```
36
+ <% if @book.errors.any? %>
37
+ ```
38
+
39
+ の箇所で、 `@book` が nil になっているせいで発生しているエラーだということがわかります。
40
+ create アクションで new ビューを表示させているので、入力内容不備によるヴァリデーションエラーを出したい状況だとわかりますが、このときは `@book` に入力内容が保持されている必要があり、 nil になっているのはおかしいです。
41
+
42
+ で、んじゃ new ビューに `@book` を渡している create アクションの中身を見てみます。
43
+ 慣れている人だと一発で分かりますが、 `list_params` を受け取っているのはいいけどこれが単なるローカル変数になってます。これだと create アクション内部でしか有効じゃ無いので、new アクションに引き継がれません。
44
+ 正常系、つまり入力内容が正しくで正常にデータを登録できる場合はこれで動作しますが、異常系の場合は new ビューに必要な `@book` を初期化してないし値を渡してもいないので、エラーに繋がっています。
45
+
46
+ 多分試行錯誤したんでしょうけど else の下にある `@books = Book.new` も意味がないです。変数名が違うし、必要なのは空の Book インスタンスではなくて、入力内容を保持しているそれですからね。
47
+
48
+ 実は同じ問題は update アクションでも起こるはず。
49
+ こちらでも book -> @book にしておくと全く同じように解消できると思います。
50
+
51
+ 大丈夫だと思うんですが、これで直らなかったらまた言ってください。