回答編集履歴

3

コードの改善方法について追記

2021/12/04 12:31

投稿

okuramasafumi
okuramasafumi

スコア117

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

回答が間違っていたのでいったん取り消し線で訂正

2021/12/04 12:31

投稿

okuramasafumi
okuramasafumi

スコア117

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

エラーが起こる箇所がわかりにくい点について追記

2021/12/04 12:04

投稿

okuramasafumi
okuramasafumi

スコア117

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回目のループでエラーが起きます。