Padrino Decorator という gem を作りました

Padrino-Decorator

背景

現在進行中のプロジェクト(Padrino で作ってます)で、view の中での分岐や helper が爆発気味になってきたので、DraperActiveDecorator みたいなものを使って 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 の事がまだちゃんと理解できていないので、理解を深めつつドックフーティングしながら改良していきたいといった感じです。

参考