テンプレート側で出力する値の処理を行うのは避ける
表示に必要なデータはプログラム側で用意し、
テンプレートではデータを埋め込む場所や表示方法などを記述する。
前置き
「そのタスクがいくつのサブタスクを保持しているか」をindex画面に表示しています。
この部分のコードが以下です。
<td><%= task.subtasks.count unless task.subtasks.empty? %><%= "-" unless task.subtasks.present? %></td>
問題点
これだとテンプレート側で出力に必要なデータの処理を行っているため、ビューとコントローラの役割分担が上手くできていません。
冒頭に述べたように、テンプレートではあらかじめ用意されたデータの「埋め込み場所や表示方法」を記述するのが正しい使い方です。
解決策
該当部分をメソッドに切り出します。テンプレートで使うメソッドなのでhelperに定義します。
module TasksHelper #タスクにサブタスクがあれば数を表示 def subtask_present?(task) if task.subtasks.present? task.subtasks.count else "-" end end end
これでindexページでの記述が以下のようにシンプルになり、処理された結果を表示するだけになりました。
<td><%= subtask_present?(task) %></td>
今回はtasks#indexでしか使わないヘルパーメソッドなのでtasks_helperに記述しましたが、アプリケーション全体で使うようであればapplication_helperに記述しましょう。