はじめに
Viewの共通化やロジックを切るときに、いつもHelperを使っていたのですが、Decoratorのことをよくわかっておらず、どちらもviewでのメソッドを作成できるものとしての認識しかなかったので、Decoratorの役割について調べてみました。
DecoratorとHelperについて
どちらもViewにロジックを書かないようにして、Viewの肥大化を防ぐ役割を持っています。
Viewで必要になるロジックをHelperで定義するのは、よく使われますが、helperばかり使っていると、どんどん肥大化していってしまいます。
他にも、helperのデメリットとして
- Viewでグローバルに有効になってしまうので、名前が被ってしまう可能性があり、バグの原因になってしまう
- モデルの情報を引数として渡した場合、名前が冗長になってしまう
等あげられます。
これらの解決策として、ActiveDecoratorが用いられます。
Helperはmodelに依存しないのですが、ActiveDecoratorではmodelに依存したロジックを書くことが可能です。
これの何がいいかというと、modelにアクセスする際に変数を介する必要がない、
引数を渡す必要がないことがメリットです。
また、viewと対応するmodelごとにdecoratorファイルを作成することが可能です。
例
Helperの場合
def user_name(model)
model.first_name + model.last_name
end
Decoratorの場合
def user_name
first_name + last_name
end
こんな感じでmodelをわざわざ渡す必要がなく、すっきりと書くことができます。
このようにDecoratorを用いることによって、Viewをシンプルに保ちつつ、メソッドが冗長になりにくく、見やすいものを作成することができます。
最後に
使い分け方としては、modelに依存したものであればDecorator、modelに依存関係がないものであればHelperを用いることによって、どちらか一方の肥大化を避けるために適切に定義してやるのがいいのかなと思っています。
参考文献
README
https://github.com/amatsuda/active_decorator/blob/master/README.md#decorating-associated-objects