[Rails6.0]Action Textで作成した内容をslimで表示する
Action Textとは
Rails6からAction Textが追加され、とても手軽にリッチテキストエディタを実装できるようになりました。
導入に関しては多くの方が記事にされているのでここでは割愛させて頂きます。
このAction Textは、has_rich_text
メソッドで指定したカラムにActionText::RichText
オブジェクトを保存します。
例えば以下のようなモデルがあったとき、
class Article < ApplicationRecord
has_rich_text :content
end
保存された内容は
<%= @article.content %>
というような形でHTMLとして取り出せます。
slimだとうまく表示されない?
これ、ERBなら綺麗に出力してくれるのですが、slimで
= @article.content
と書くとHTMLがそのまま文字として出力されてしまいます。
こんなHTMLむき出しのままではとてもじゃないけど使えない!
ERBならHTMLをタグとして扱ってくれるので、ERBで書き直すしかないのかと思っていたのですが…
=
ではなく==
を使う
githubのissueによると、slimの=
はHTMLの内容をエスケープして表示してくれるようです。
なのでこの場合は=
ではなく==
を使うことでHTMLの内容をエスケープせずに表示することができます。
== @article.content
期待通りの結果になりました!
エスケープしなくて大丈夫なの?
HTMLをエスケープしてしまったら、XSSの脆弱性は大丈夫なの?と思ったので
<script>
alert('XSS');
</script>
をフォームの入力に含めて保存してみました。
alertが表示されると思ったのですが…
scriptタグはちゃんとエスケープしてくれます。なんで?
slimのREADMEを読んでみましたがイマイチ理由が分からず。どなたかコメントでご教授いただけると幸いです。
まとめ
兎にも角にもAction Textとslimを両立させることができて一安心です。
何か直すべき点、間違った記述があればコメント等で指摘していただければと思います。
参考文献
https://railsguides.jp/action_text_overview.html
https://tech.mof-mof.co.jp/blog/rails6-actiontext.html
Author And Source
この問題について([Rails6.0]Action Textで作成した内容をslimで表示する), 我々は、より多くの情報をここで見つけました https://qiita.com/sasakura_870/items/05228da2a34471a4af9d著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .