draperを使ってviewに書いてしまいがちなロジックを減らす2
先日書いた記事でdraperについて紹介しましたが、これの続きです。
railsでページネイションを使う場合、最近はkaminariを使うケースが多いと思います。
で、このkaminariを使って取得した値(例えばMovieというモデルがあるならばMovie.page(1).per(20)というように取得したMovieモデルの配列)の一要素に含まれるUserにこのdraperで定義したメソッドを適用するには一工夫必要です。
何もしなければcurrent_pageがないよーというエラーが出たりします。
じゃ、何をするのか。それはズバリ、config/initializers/draper.rbを作って以下のコードを追加するだけです。
Draper::CollectionDecorator.delegate :current_page, :total_pages, :limit_value, :total_count
後は使う側で以下のようにコードをすればよいです。
@movies = MovieDecorator.page(1).per(20).decorate
で、app/ を以下のように作成してちゃんとcreated_timeメソッドが使えるかテストしてみると使えることが確認できます
class MovieDecorator < Draper::Decorator delegate_all def created_time movie.created_at.strftime("%y-%m-%d %H:%M") end end
以上です。モデルの中の値を、ある条件かだけ表示を変えたい時とかhelperを使わずにこのdeaoratorを使ってやるようにする。その際はこのgemを使うといいかもしれませんね。