Ruby/RailsでのBuilder Patternについて三歩進んで二歩下がった

photo credit: Andrew* via photopin cc

前回、色々試行錯誤して、以下のようにまでは出来たと書いた。

@api = Api::PanelApi.build do
  self.id = '999'
  self.title = 'サンプルタイトル'
  self.url = '//www.example.com/'
  self.left_panel = build_panel do
    self.priority = 'normal'
    self.template_type = 'template'
    self.title = 'サンプルタイトル'
    add_link do
      self.id = 'left-sample1'
      self.title = 'left-title-sample1'
      self.url = '//www.example.com/'
      add_image do
        self.width = 200
        self.height = 300
        self.url = 'imageurl'
      end
    end
  end
  self.right_panel = build_panel do
    self.priority = 'normal'
    self.template_type = 'template'
    self.title = 'サンプルタイトル'
    add_link do
      self.id = 'right-sample1'
      self.title = 'right-title-sample1'
      self.url = '//www.example.com/'
      add_image do
        self.width = 200
        self.height = 300
        self.url = 'imageurl'
      end
    end
  end
end

そこから色々試行錯誤しているのだが、self.を抜くことが出来ないので、質問したところ、

instance_eval使っていれば、selfは不要です。Linkのインスタンス内で実行されているのと同じことになるためです。

ぬぬぬぬ…instance_evalを使ってこれなんだけど、まだ試していない記述の仕方があるようだと思っていたら、

ごめんなさい。セッターなのでself必要でした。。。そうなると記述量あまり減らないですし、selfの記述が紛らわしくて微妙ですね。。。すみません。

やったー! 青い鳥のように探し求めていたものは実は既に手元にあったんだーってパターンかと思ったら…

Linkに別のセッターメソッドを定義するか、block.callを代わりに実行して引数としてはself(Linkのインスタンス)渡すとかが代案です。

アババババ…まだまだゴールまでの道のりは遠そうだなぁ…。