開発しているなかで、Helperの役割かModelの役割か迷うことがあったので、Helperの役割について考えてみました。
よく言われているHelperの役割
View層の中で、単純な表示以外の処理を担当します。
Modelとの使い分け
例
ログインユーザーが管理者権限がある場合は管理者メニューを表示、管理者権限がない場合はプロフィールを表示する。
変更前
View.html.haml
-if @user.role == "admin"
link_to "管理者メニュー", •••
-else
link_to "#{@user.last_name} #{@user.first_name}様のプロフィール", •••
変更内容
管理者権限があるかの判定
Modelに実装します。
Model.rb
def admin?
role == "admin"
end
リンク文言の生成
悩ましいですが、フルネームを生成するのはModel、それ以外はHelperという使い分けがいいのではないでしょうか。
Model.rb
def full_name
"#{last_name} #{first_name}"
end
Helper.rb
def profile_link(user)
"#{user.full_name}様のプロフィール"
end
変更後
View.html.haml
- if @user.admin?
link_to "管理者メニュー", •••
else
link_to profile_link(@user), •••
思想としては、データに関する処理はModel、表示に関する処理はHelperに実装なのですが、明確な切り分けってできないと思いました。「フルネームの生成」が表示に関する処理なのかが曖昧なため、Helperで実装する人もいるのではないでしょうか。
Draperという設計もあるらしいですが、結局のところ、「表示に関する処理」というところを明確に線引きできなければ根本解決にならず、Draperに実装するかModelに実装するか悩むことになります。
結論
Helperの役割の明確な線引きはできない。ただ何となく、htmlに関する処理か文字の加工程度に留め、少しでも表示以外に使いそうなものはModelに実装してしまっていいのではと思います。
いい方法があれば教えてください。