コントローラ以外で Slim のテンプレートを描画する

More than 1 year has passed since last update.

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