テンプレート側で出力する値の処理を行うのは避ける

表示に必要なデータはプログラム側で用意し、
テンプレートではデータを埋め込む場所や表示方法などを記述する。

前置き

「そのタスクがいくつのサブタスクを保持しているか」をindex画面に表示しています。
f:id:naito-coding0322:20180919155248p:plain

この部分のコードが以下です。

<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に記述しましょう。