回答編集履歴
3
コードの改善方法について追記
test
CHANGED
@@ -3,6 +3,30 @@
|
|
3
3
|
|
4
4
|
|
5
5
|
~~意図と達成するには、該当のif文を`if @mandalarts.blank?`にするとよいでしょう。~~
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
当初の想定は私の勘違いでした。改めて状況を確認してみたのですが、やはり @winderboum さんがおっしゃるようにテスト環境にのみすでに1件または2件のデータが保存されてしまっているとしか考えられません。
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
もうちょっと深掘りすると、この`index`メソッドは`GET`でアクセスされるものであるにも関わらず、「データがないならデータを作る」という振る舞いをしてしまいます。これは冪等性を満たしていません。また、すでにデータが1件でも存在するなら何もしませんが、それでは「データが9件必要である」という要件を満たせません。
|
14
|
+
|
15
|
+
このような「一定の初期データが必要である」という状況では、開発環境ではseedと呼ばれる仕組みが、テスト環境ではfixtureまたはfactoryと呼ばれる仕組みが、それぞれ使われます。
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
seedについては
|
20
|
+
|
21
|
+
[公式ガイド](https://railsguides.jp/active_record_migrations.html#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%82%B7%E3%83%BC%E3%83%89%E3%83%87%E3%83%BC%E3%82%BF)を参照してください。
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
factoryについてはすでに利用されているようですが、system specの`before`ブロックで`FactoryBot.create_list :mandalart, 9)`を実行することで毎回9件のレコードを保存できます。
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
ついでに、本番環境では基本的に1度保存したデータは削除されないため、手動で9件のデータを作成することで問題ないかと思われます。
|
6
30
|
|
7
31
|
|
8
32
|
|
2
回答が間違っていたのでいったん取り消し線で訂正
test
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
`if @mandalarts == []`の行が間違っています。`@mandalarts = Mandalart.all`で得られるオブジェクトは配列**ではなく**、`ActiveRecord::Relation`というオブジェクトです。ですので、このif文は常にfalseとなります。
|
1
|
+
~~`if @mandalarts == []`の行が間違っています。`@mandalarts = Mandalart.all`で得られるオブジェクトは配列**ではなく**、`ActiveRecord::Relation`というオブジェクトです。ですので、このif文は常にfalseとなります。 ~~
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
意図と達成するには、該当のif文を`if @mandalarts.blank?`にするとよいでしょう。
|
5
|
+
~~意図と達成するには、該当のif文を`if @mandalarts.blank?`にするとよいでしょう。~~
|
6
6
|
|
7
7
|
|
8
8
|
|
1
エラーが起こる箇所がわかりにくい点について追記
test
CHANGED
@@ -3,3 +3,13 @@
|
|
3
3
|
|
4
4
|
|
5
5
|
意図と達成するには、該当のif文を`if @mandalarts.blank?`にするとよいでしょう。
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
【追記】
|
10
|
+
|
11
|
+
エラーがなぜ15行目で起きているかについて説明します。
|
12
|
+
|
13
|
+
Rubyでは`[][0..2] # => []`という実行結果になります。これはつまり、「空の配列に対して範囲アクセスをした場合、範囲に0が含まれていると空の配列が返ってくる」ということです。一方、範囲が0を含まないと`[][3..5] # => nil`のようになります。
|
14
|
+
|
15
|
+
このため、最初のループではエラーは起きず(しかし要素がないので何も起きない)、2回目のループでエラーが起きます。
|