Padrino Decorator という gem を作りました
背景
現在進行中のプロジェクト(Padrino で作ってます)で、view の中での分岐や helper が爆発気味になってきたので、Draper や ActiveDecorator みたいなものを使って Decorator層に描画に特化したメソッドをまとめる機構がほしいなーと思ったのでとりあえず作ってみました。
実装は Exhibit パターンっぽくしたかったので、ほとんど #287 Presenters from Scratch(Pro版なので課金しないと見られません) と同じような感じになってます。そこに Padrino で使いやすくなるように Generator をつけたりしてます。
使い方
色々すっ飛ばしますが、
$ padrino g decorator user
のようにすると、decorator 用のクラスのファイルと、テストコンポーネントが指定されている場合はテスト用のファイルが生成されます。
使用例
# app/decorators/user_decorator.rb class UserDecorator < Padrino::Decorator::Base decorate :user def username [user.first_name, user.last_name].join(' ').strip end def link h.link_to full_name, user.website end end
/ app/views/users/show.slim - present @user do |user_presenter| div#profile h1 = user_presenter.link dl dt Username: dd = user_presenter.username dt Website: dd = user_presenter.website / …
コレクション的なオブジェクトを Decorate して扱いたい場合は、
$ padrino g decorator users
というように複数形の名前で decorator クラスを作っておくと、
decorate @users
としたときに先頭オブジェクトのクラス名から空気を読んで使うようになっています。 もしくは、
decorate @users, as: FooDecorator
というように as オプションでデコレータクラスを指定します。
これから
Decorator や Presenter, Exhibit の事がまだちゃんと理解できていないので、理解を深めつつドックフーティングしながら改良していきたいといった感じです。