content_tagを入れ子とかネストとか
Rails3.2にしてからの一番のお気に入りになった「content_tag」ですが、ネストとか入れ子構造にすると生成したタグがそのまま現れたりしてガッカリしていたので調べ直した。
単純なタグ作成例(メッセージは2番めじゃないとエラーになった)
content_tag :div, "message", :class=>"hoge" content_tag(:div, "message", :class=>"hoge") #<div class="hoge">message</div>
単純な入れ子の例
content_tag(:div, content_tag(:p, "message", :class=>"fuga"), :class=>"hoge") #<div class="hoge"><p class="fuga">message</p></div>
ここまでは問題なしで出来る。うんうん
こんなのをヘルパーで作りたい場合
<div class="tooltip">hoge<span class="tip">hogeと書いて「ホゲ」と読む</span></div>
今までの例だとこれで出来そうだけど、実はエラーになる
content_tag(:div, ("hoge" + content_tag(:span, "hogeと書いて「ホゲ」と読む", :class=>"tip"), :class=>"tooltip")
ちょっと変わった入れ子になるとエラーになるので悩ましい。
解決方法
content_tag :div, :class=>"tooltip" do concat "hoge" concat content_tag(:span, "hogeと書いて「ホゲ」と読む", :class=>"tip") end
こんな感じにすること。
aタグをマシマシで書くとこんな感じ
content_tag(:a, "message", :href=>url, :target=>"blank", :class=>"css")
タグ名、内容、オプションsな順で書けばOKなはず。