迷い人

日々勉強。勉強の先に何か見つかるといいなぁ

【rails】エスケープ文字について

今日はエスケープ文字についてメモしておく。

 

railsではxss対策のための自動でエスケープしてくれる。

そのため、リンクがおかしな事になってしまうので少し細工してあげる必要がある。

 

以下具体例で説明する。

 

質問を投稿するとその一覧が表示され、1つ質問を選んで回答が返せるアプリを考える。

 

一覧表示させる質問にはカテゴリが設定されており、カテゴリを選択すると、そのカテゴリを含む質問のみ一覧表示できるとする。

 

index.html.erbでは該当部分のリンクを

<%= link_to "カテゴリの名前" "指定されたカテゴリのみ抽出するメソッドへのパス" %>

のように記述していた。

 

動作の流れの概要は以下のような感じ。

画面に一覧表示されている質問にカテゴリが表示されている

カテゴリをクリックすると、そのカテゴリを含む一覧が表示される

 

ここでviewを見やすくするために、上記部分をhelperに切り出した。

 

以下がhelperの記述となる。

 

def show_category(instance)
categorys = instance.categorys.all
html_text = ''
categorys.each do |category|
html_text += link_to "#{category.name} ", "/categorys/#{category.id}/questions"
end
return html_text
end

 

しかし、これだとうまくリンクが作れない。

 

正解は以下

 

def show_category(instance)
categorys = instance.categorys.all
html_text = ''
categorys.each do |category|
html_text += link_to "#{category.name} ", "/categorys/#{category.id}/questions"
end
return html_text.html_safe
end

 

ポイントはhtml_text.html_safeの部分。この記述をすることでエスケープ文字の対応が行われなくなり、きちんとカテゴリのリンクを作ることができた。

 

あとがき:

そもそもhtml_textにまとめて書かずにcontent_tagを使ってやろうとして失敗したりしている。helperでリンクを返す時はその仕組みをしっかりと理解しなければならないと実感した。