7のイベントを再登録するWindows7/8/10でRustを別ドライブに展開する際のTIPSPHP+SQLでMySQLのInnoDBのテーブルに複合キーかつ連番のINSERTを実装するネイティブなPHPでselectタグやradioボタンの選択状態をどう表現するかエンターキーによる入力項目のフォーカスの移動をWeb系システムに実装してみるCattleMute>Ruby/Rails>html_safe(HTMLをエンティティ化しないメソッド)との出力関係の理解2017.10.26html_safe(HTMLをエンティティ化しないメソッド)との出力関係の理解Railsでは通常、フォームなどから投げられたデータは自動でHTMLのエンティティ化が行われる。そのため、このエンティティ化をしないときにhtml_safeメソッドを使用して生のHTMLを取り出してくるが、これについて少しハマった。今回は俺のいつものエラーでハマったという話ではなく、「なぜこうなるの?」と少し悩み、その際に行った推測と検証からこれについて落とし込んだ内容となる。/>に変換する」というよくある変換をかけようとした際に記事タイトルのような疑問が生まれた。%>このように出力したときにフォームから送信したデータが、自動でエンティティ化されていることに、今更で恥ずかしながら気づいた。「あ、Railsって自動でHTMLのエンティティ化されるんや!便利やん!」とか最初は思っていたんだけど、「じゃあエンティティ化外す場合はどないすんねんや」とリファレンスを探した。以下のようにhtml_safeを使えばできるということがわかった。%>で、これが全ての事の発端だった。/>については変換しないようにする。今日び色んなサイトがあるわけでその方法のヒントもすぐに出てきた。それらからコードを組み合わせて、実際のコードをこんな感じで書いたんだ。/>の変換用のコードを組み合わせる。これで目的の結果は得られた。得られたんだが・・・。ここで俺の頭に疑問点が出てきた。実は最初の時点で、「あ、Railsって自動でHTMLのエンティティ化されるんや!便利やん!」と思って俺が行った理解は「<%=%>で変換されてるんやな!」という相当ざっくりとしたことだった。そこにhtml_safeメソッドを入れてみて出力結果を見てみて、これはエンティティ化を解除する関数的な役割を出しているものだと理解していた。string.html_safeを変数hogeに入れた場合、変数hogeに入っているものはエンティティ化が解除されたstringであると思っていた。この場合、変数hogeにはstring.html_safeで生のHTMLが入っていることになる。%>で出てくる結果としては、「<%=%>でエンティティ化された文字列」が出力されるはずだ。/>として」の正常な結果が得られている。それだと当該の変換を行った際に、俺がした理解に矛盾が生じてくる。このままうやむやにするとなんか気持ち悪いので、検証を行った。%></p>検証を行うに当たり、以上のようなコードを作成。hoge[‘plain’]は変数stringをそのまま代入したもの、hoge[‘html_safe’]はエンティティ化を解除するものである。コメントアウトされているraiseのコメントを外して、実行してみると以下のような結果が得られた。上記の通り、hoge[‘plain’]とhoge[‘html_safe’]には全く差異がない。%>の結果を表示してみる。このような結果となった。いうことはつまり、html_safeメソッドは付けたその時点での単純な変換は行われていないということになる。%>内で有効な、プロパティのような働きをするメソッドであるということ。「html_safeメソッドとは単純に文字列のHTMLをエンティティ化しないように変換するメソッド」という理解ではなく、「html_safeメソッドを辿らせておくことで、<%=%>で出力する際に文字列をエンティティ化しないようにする」という理解を得たほうが正しい。他の出力に関わるメソッドも同じようになってんだろう。Railsのアクとクセの強いところなんだよなぁ・・・。今回の検証と理解はいいお勉強内容となった。カテゴリRuby/Railsこの記事のコメントコメントはないです。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。