2011-02-04 10 views
1

私はhをHTMLにエンコードしていますが、アポストロフィに問題があります。より正確に言えば、アポストロフィは'として終わり、明らかに私が表示したくないことが分かります。Rails 2でHTMLエンコードアポストロフィが予期しない結果をもたらすのはなぜですか?

これはなぜ起こっているのですか?私の研究では、HTMLエンコーディングはアポストロフィに影響しないはずです。

+0

本当に ''')が表示されているものに '''が出力されていますか、それともhtmlを表示しているときに表示されていますか? –

+0

yup - ユーザーが見ている' – tiswas

答えて

3

これは興味深い質問です。私はどのように矛盾しているのが見えているのですかh AKA html_escapeはアポストロフィAKA "'"を処理します。

ERB::Util 2.6.6用のRDocによると:IRBで

ESCAPE_TABLE = { '&'=>'&amp;', '<'=>'&lt;', '>'=>'&gt;', '"'=>'&quot;', "'"=>'&#039;', } 

gem list erubis 
*** LOCAL GEMS *** 
erubis (2.6.6) 

私は以下を参照してください

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&quot;bar" 

EDIT:

へぇ、それはバグですか、で少なくとも一貫性のない方法を使用してください。 gsubに渡される文字列は"'"が含まれていない

# File 'lib/erubis/helpers/rails_helper.rb', line 342 

def h(value) 
    value.to_s.gsub(/[&<>"]/) {|s| ESCAPE_TABLE[s] } 
end 

注意:ここではソースですか?つまり、ESCAPE_TABLEのルックアップは一重引用符/アポストロフィでは呼び出されません。

そして、私たちは皆、ビスケットの要点がアポストロフィーであることを知っています。 :-)

あなたのバージョンのRailsでhまたはhtml_escapeの定義を見ると、その文字列にアポストロフィが含まれていることがわかります。

解決方法は、ERB/Erubisをアップグレードするか、h/html_escapeの定義を上書きすることです。上記の定義を出発点として使用できます。

1

Ruby on Rails 3は自動的にhになります。これはもはや必要ではありません。あなたはそれをエスケープせず、出力は何もしたくない場合は、

<%= @post.body %> 

代わりの

<%=h @post.body %> 

を使用rawを使用します。

<%=raw @post.body %> <!-- For example, for use in a plaintext format */ 
+1

恐れています。私はレール2を使用しているので、問題はまだありません。私はこの情報を含めるために私の質問を編集します。 – tiswas

+1

@tiswasこの問題は、同じ問題を抱えているRails 3ユーザーには残しておきます。私はそれをCommunity Wikiにします。 –

1

actionpack/lib/action_view/erb/util.rbアポストロフィでソースコードを見てから、エンコードされていません、& > < "文字のみです。

私の推測では、あなたのRailsアプリケーションのどこかにライブラリ/プラグイン/ gemがhtml_escapeまたはHTML_ESCAPEの定数を再定義したと思います。データベースで直接データをチェックして、保存時にまだエンコードされていないことを確認する必要があります。

3

私はこの問題は、実際に私は、テキストを表示するためにtruncate機能を使用していたということのようです &#39;としてアポストロフィを表示していましレール4に同様の問題がありました。それが削除されると、アポストロフィは期待どおりに表示されます。

この場合、切り捨てるオプションとしてescape:falseを追加すると、問題が解決されます。

関連する問題