Slide 1

Slide 1 text

札幌Ruby会議に行った勢いで ActiveDecoratorを 導入しようとしてみた [email protected]

Slide 2

Slide 2 text

誰? ● 黒木慎介といいます ● AimingでRailsとJS(Backbone.js/CoffeeScript) でブラウザゲームを作る仕事をしています

Slide 3

Slide 3 text

提供 We're hiring rubyists!

Slide 4

Slide 4 text

札幌Ruby会議に 行って来た

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

閑話休題

Slide 7

Slide 7 text

実践的な2つのセッション ● 松田明さんと豪華ゲスト陣による 「Rails3レシピブック外伝」 ● 浦嶌啓太さんによる 「Ruby on Rails: The Bad Parts」

Slide 8

Slide 8 text

両方の発表に登場した "ActiveDecorator"

Slide 9

Slide 9 text

何? (このスペースはそれを説明するには狭すぎるので ホワイトボードに書きます)

Slide 10

Slide 10 text

少し前のこと "これは、やっていることとしては完全にビューヘル パー(最後に文字列をhtml_safeしているし)なの で、引数を調整してヘルパーに引っ越せません か?"

Slide 11

Slide 11 text

ActiveDecoratorは まさにこの問題を解決するのではないか?

Slide 12

Slide 12 text

しかし、事は慎重に ● 自分がいるチームのサービスは既に稼働してい る ● 内部で何をしているかわからないものをいきな り導入するのはリスクが高すぎる ● 中のコードをちゃんと確認して動作を把握してか ら導入したい

Slide 13

Slide 13 text

というわけで コードを読んでみた (間違いや不備があったら教えて下さい)

Slide 14

Slide 14 text

コード読んでみた(1) ActiveDecorator::Decorator#decorate ● 引数に取ったオブジェクトに対応したdecorator をextendさせる ● "#{クラス名}Decorator"という名前のクラスを自 動的にdecoratorとして扱う ● decoratorはActiveDecorator::Helpersをinclude し、viewの文脈で呼び出せる各種メソッドを利用 可能にする ● オブジェクトがActiveRecord::RelationやArrayの インスタンスだった場合、その中の各要素を decorateする ● decorateされるオブジェクトに特に制限はない

Slide 15

Slide 15 text

コード読んでみた(2) decorateはいつ何に対して行われるのか? 1. controllerのrenderの中で a. assignされた各オブジェクトに対して 2. viewのrender partialの中で a. localに渡した各オブジェクトに対して

Slide 16

Slide 16 text

動作の把握ができたところで 実際に組み込んでみた

Slide 17

Slide 17 text

実際に組み込んでみた(1) 直面した問題 ● @user.team.link_with_name → MethodMissing ● @userはdecorateされるが @user.teamはされない

Slide 18

Slide 18 text

実際に組み込んでみた(2) 解決策 ● 答えは松田さんのスライドの中に ● 「関連先をdecorateしたい時は」→関連先を参 照する部分をpartialに切り出す ● やってみると、各templateのファイルがすっきり する ● 最初は正直「必要な実装が漏れてるんじゃない の?」と思ったけど、実際やってみて設計意図を 理解した

Slide 19

Slide 19 text

実際に組み込んでみた(3) やってみての印象 ● 現在helperに存在するメソッドをdecoratorに移 行するのは割と大変 ○ 先述の問題のため ○ 切り出す必要があるtemplateが1つであるとは限らない ● helperお役御免、ではない ○ 移行が難しかったり、helperにあるのが妥当であるメソッ ドはある ● 新規実装でdecoratorを使うのは低コスト ○ とりあえず使い始めて、徐々に移行していくのがよさげ

Slide 20

Slide 20 text

おしまい