HTML を描画する処理をヘルパやデコレータで content_tag や concat を駆使して書いていると、コードの行数がどうしても膨らんでしまう。そのためヘルパやデコレータから Slim の機能を使って Slim テンプレートを描画してみる。
app/views/components/context_menu/item.html.slim
li disabled=disabled
a.js-context-menu-item data-method=(method || :get) href=url
= body
locals = { disabled: true.to_s, method: :get, url: '#', body: 'リンク' }
slim_path = Rails.root.join('app/views/components/context_menu/item.html.slim')
Slim::Template.new(slim_path).render(Object.new, locals)
#=> "<li disabled=\"true\"><a class=\"js-context-menu-item\" data-method=\"get\" href=\"#\">リンク</a></li>"
次のようにヘルパメソッド化すると便利。
# app/views/components ディレクトリ以下の Slim ファイルを描画する。
def render_component(name, locals = {}, options = {}, &block)
slim_path = Rails.root.join('app/views/components', "#{name}.html.slim")
Slim::Template.new(slim_path, options).render(Object.new, locals, &block)
end