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

回答編集履歴

2

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

2021/11/17 21:47

投稿

MasaSakano
MasaSakano

スコア188

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

1

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

2021/11/17 21:47

投稿

MasaSakano
MasaSakano

スコア188

answer CHANGED
@@ -4,17 +4,17 @@
4
4
  可能性は二つ思いつきます。
5
5
  `routes.rb` がないので、100%の確信は持てませんが。
6
6
 
7
- 一つの可能性は、Controller中の`@book_form = Book.new`がERBにわたっていて、それがpartialの`_form.html.erb`に`model`として渡り、それを変数`f`でiteratorに渡しているという場合。
7
+ 一つの可能性は、Controller中の`@book_form = Book.new`がERBにわたっていて、それがpartialの`_form.html.erb`に`book`として渡り、それを変数`f`でiteratorに渡しているという場合。
8
8
  この場合、`_form.html.erb` の文
9
9
  `form_with model:book,local:true do |f|`
10
- 中で`f` に入っているのはformオブジェクトであり、`model`に入っているのが、モデルのインスタンス`Book.new`です。
10
+ 中で`f` に入っているのはformオブジェクトであり、`book`に入っているのが、モデルのインスタンス`Book.new`です。
11
11
 
12
12
  method `new_record?` は、モデルに対して有効です。`f.object`は、formオブジェクトの`object`メソッドの返り値です(私はそのメソッドを知りません)。少なくともそれは、モデルと何の関係もありません。だから、それがnilであることは驚かないし(←エラーを見るにそれが現状ですね)、あるいはそうでなくてもきっと `new_record?`というメソッドを持つオブジェクトではないし、仮に同メソッドを持っていたとしても、それは新規レコードかどうかとは何も関係ありません。つまり筆者の意図とはかけ離れています。
13
13
 
14
14
  対策ですが、この場合、`new_record?`の文を
15
15
 
16
16
  ```ruby
17
- if model.new_record?
17
+ if book.new_record?
18
18
  ```
19
19
 
20
20
  と書き換えると動くのでは、と推測します。