回答編集履歴

2

`form.object`に関して誤解があったので、全体を大きく変更。

2021/11/17 21:47

投稿

MasaSakano
MasaSakano

スコア188

test CHANGED
@@ -1,3 +1,7 @@
1
+ [編集: 誤解があったので、大きく編集しました]
2
+
3
+
4
+
1
5
  > エラー文よりobjectが空だと思い、
2
6
 
3
7
 
@@ -20,11 +24,11 @@
20
24
 
21
25
 
22
26
 
23
- method `new_record?` は、モデルに対して有効です。`f.object`は、formオブジェクトの`object`メソッドの返り値です(私はそのメソッドを知りません)。少なくともそれは、モデルと何の関係もありません。だから、それがnilであることは驚かないし(←エラーを見るそれが現状でね)、あいはそうでなくてもきっと `new_record?`というメソッドを持つオブジェクトではないし、仮に同メソッドを持っていたとしても、それは新規レコードかどうかとは何も関係ありません。つまり筆者の意図とはかけ離れています。
27
+ method `new_record?` は、モデルに対して有効です。`f.object`は、formオブジェクトの`object`メソッドの返り値です。少なくとも Rails 5+ では、それは、与えたモデルに相当するうです([APIマニュアル](https://api.rubyonrails.org/v6.0.2/classes/ActionView/Helpers/FormBuilder.html))
24
28
 
29
+ 。だから、それがnilであるということは、`book` にそもそもモデルのインスタンスが入っていないことを意味します。
25
30
 
26
-
27
- 対策ですがこの場合、`new_record?`の文を
31
+ たとえば、`new_record?`の文を
28
32
 
29
33
 
30
34
 
@@ -36,14 +40,14 @@
36
40
 
37
41
 
38
42
 
39
- と書き換えると動くのは、推測します。
43
+ と書き換えると、状況がより明快になるしょう。同じこ
44
+
45
+ モデルがnilということは、`@book_form` がうまく渡っていないことを意味します。もう一つの回答に推測が書かれている(私とほぼ同時に投稿したものです)ので、そちらを参照するといいかも知れません。
40
46
 
41
47
 
42
48
 
43
49
  もう一つの可能性は、そもそも`routes.rb`が正しく記述されていなくて、意図通りのControllerが読めていないことです。ログ出力を見たり、debug情報を出力させたりして、意図通りに動いているか、チェックすると良いでしょう。
44
50
 
45
- なお、その場合でも、上述の書き換えは必要だと思います。
46
-
47
51
 
48
52
 
49
53
  以上、推測に基づく回答でした。

1

コード中、model → book の変更。

2021/11/17 21:47

投稿

MasaSakano
MasaSakano

スコア188

test CHANGED
@@ -10,13 +10,13 @@
10
10
 
11
11
 
12
12
 
13
- 一つの可能性は、Controller中の`@book_form = Book.new`がERBにわたっていて、それがpartialの`_form.html.erb`に`model`として渡り、それを変数`f`でiteratorに渡しているという場合。
13
+ 一つの可能性は、Controller中の`@book_form = Book.new`がERBにわたっていて、それがpartialの`_form.html.erb`に`book`として渡り、それを変数`f`でiteratorに渡しているという場合。
14
14
 
15
15
  この場合、`_form.html.erb` の文
16
16
 
17
17
  `form_with model:book,local:true do |f|`
18
18
 
19
- 中で`f` に入っているのはformオブジェクトであり、`model`に入っているのが、モデルのインスタンス`Book.new`です。
19
+ 中で`f` に入っているのはformオブジェクトであり、`book`に入っているのが、モデルのインスタンス`Book.new`です。
20
20
 
21
21
 
22
22
 
@@ -30,7 +30,7 @@
30
30
 
31
31
  ```ruby
32
32
 
33
- if model.new_record?
33
+ if book.new_record?
34
34
 
35
35
  ```
36
36