私は小さなRuby DSLを書こうとしていて、不便を感じました。今、私の「DSL」のコードはhttps://gist.github.com/0379b07f516f4f322204あると(.html.erbファイル内の)私の実装コードは次のとおりです。ブロックの環境に孤立していないDSLを書くにはどうすればいいですか?
html_table_for @users do |t, user|
t.field :username, link_to(user.username, :action => 'show', :id => user.id)
t.field :email
t.field :roles, user.roles.map(&:code).join(', ')
end
実装コードは非常にためにt.field
の代わりに、単にfield
のDSLのようには見えません。 DSLコード(行34)の@block.call
をinstance_exec(@block)
に置き換えることで、私は欲しいものを手に入れましたが、その後ActionViewの良さ(つまりlink_to
)を失います。
Railsに含まれるActionPackのヘルパーメソッドの可用性を維持しながら、私の小さなDSLクラスのインスタンスメソッドをブロックで利用できるようにする方法はありますか?