Rails 2 で一部のテキストを HTML エンコードするために使用h
していますが、アポストロフィに問題があります。より正確に言うと、アポストロフィが最終的'
に表示したくないものになっていることがわかりました。
なぜこれが起こっているのか誰にも考えがありますか?私の調査によると、HTML エンコーディングはアポストロフィに影響を与えるべきではありません。
Rails 2 で一部のテキストを HTML エンコードするために使用h
していますが、アポストロフィに問題があります。より正確に言うと、アポストロフィが最終的'
に表示したくないものになっていることがわかりました。
なぜこれが起こっているのか誰にも考えがありますか?私の調査によると、HTML エンコーディングはアポストロフィに影響を与えるべきではありません。
これは興味深い質問です。AKAがアポストロフィ AKA を処理h
する方法に一貫性がありません。html_escape
"'"
ERB::Util 2.6.6の RDoc によると:
ESCAPE_TABLE = { '&'=>'&', '<'=>'<', '>'=>'>', '"'=>'"', "'"=>''', }
gem list erubis
*** LOCAL GEMS ***
erubis (2.6.6)
IRB では次のように表示されます。
Welcome to IRB. You are using ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10.5.0]. Have fun ;)
>> require 'erb' #=> true
>> ERB::Util.html_escape("foo'bar") #=> "foo'bar"
>> ERB::Util.html_escape('foo"bar') #=> "foo"bar"
編集:
へー、それはメソッドのバグか、少なくとも矛盾h
です。ソースは次のとおりです。
# File 'lib/erubis/helpers/rails_helper.rb', line 342
def h(value)
value.to_s.gsub(/[&<>"]/) {|s| ESCAPE_TABLE[s] }
end
に渡される文字列に?gsub
が含まれていないことに注意してください。"'"
つまり、ESCAPE_TABLE のルックアップは、単一引用符/アポストロフィでは呼び出されません。
そして、ビスケットの核心はアポストロフィであることは誰もが知っています. :-)
h
おhtml_escape
使いのバージョンの Railsの定義を確認すると、その文字列にアポストロフィが含まれていることがわかると思います。
修正は、ERB/Erubis をアップグレードするか、h
/html_escape
定義を上書きして正しくすることです。上記の定義を出発点として使用できます。
アポストロフィが次のように表示されるRails 4でも同様'
の問題がありました。問題は、実際にtruncate
はテキストを表示するために関数を使用していたようです。それが削除されると、アポストロフィが期待どおりに表示されます。
この場合escape:false
、truncate のオプションとして追加すると問題が解決します。
actionpack/lib/action_view/erb/util.rb
アポストロフィのソースコードを見ると、エンコードされておらず、& > < "
文字のみです。
私の推測では、Rails アプリのどこかにライブラリ/プラグイン/gem が再定義されているhtml_escape
か、HTML_ESCAPE
定数があると思います。また、データベース内のデータを直接チェックして、保存時にまだエンコードされていないことを確認する必要があります。
Ruby on Rails 3 はh
自動的に行います。これはもう必要ありません。使用する
<%= @post.body %>
それ以外の
<%=h @post.body %>
エスケープせずに何かを出力したい場合は、次を使用しますraw
。
<%=raw @post.body %> <!-- For example, for use in a plaintext format */