RailsのERBでpartialをrenderする方法
RailsでオリジナルなCMS的なものを作っています。
その中で、ERBでpartialをどうrenderすると予期せぬ動作になっていまったので同じような悩みを持った方に解決策を共有いたします。
RailsでのCMSとERB
CMSを作るとなると、ERBを多用することになると思います。(他のテンプレートエンジンを使われた場合は別ですが)
例えば、記事の中で商材やCTAをpartialとして出したりするときや、Wordpressのカテゴリーページに該当する箇所で右カラムを出すなどがあります。
他にはtitleタグには必ず「記事のタイトル!|○○ならサイト名」みたいにタイトルのお尻にサイト名を付け加えるのがいまのSEOのセオリーだったりします。なので、記事のタイトルに対して、titleタグのひな型の定義をさせといて「記事のタイトル! | <%= site_name %>」とすることで可変で出力ができとても便利です。
ERBは本ではパーフェクトRailsに解説されており、とても分かりやすいです。
基本的な構文は下記のようになります。
erb = ERB.new('partialを含んだ文字列')
@html = erb.result(binding())
ただ、partialをrenderする場合うまくできませんでした。
そういったときは下記のように出力することでコンテキストの変数を評価しながらレンダリングしたいhtmlを得ることができます。
ERBとpartialとrenderと問題
先ほど紹介したERBの基本的な使い方で、partialをrenderすると意図しない結果がでます。
具体的には、partialをrenderする内容を含むerbオブジェクトをresultで評価しようとすると評価結果は、partialのみしか出てきません。
これには困りました。RailsがERBを利用していてpartialを実現できているにもかかわらず、手動ですると意図しない結果になるからです。一生懸命Googleで検索しても、任意の回答は出てきません。
ただCMSの機能としてpartilaを呼び出せないのは大問題なので問題にあたってから2時間くらいでぼーっとなってきたところで対処策が閃きました。
partialの呼び出し方を
<%= render partial: 'sample_partial' %>
から
<%= render_to_string partial: 'sample_partial' %>
にすることです。
文字で説明するとERBが評価される文字列ではrenderメソッドでpartial呼び出すのではなく、render_to_stringメソッドで呼び出すということです。
これで任意のhtmlを文字列にすることができます!
ぜひお試しください。