我使用h
來對Rails 2中的一些文本進行HTML編碼,但是我在使用撇號時遇到了問題。更準確地說,我發現我的撇號最終爲'
,這顯然不是我想要顯示的。爲什麼Rails 2中的HTML編碼撇號會產生意想不到的結果?
任何人有任何想法,爲什麼發生這種情況?我的研究暗示HTML編碼不應該影響撇號。
我使用h
來對Rails 2中的一些文本進行HTML編碼,但是我在使用撇號時遇到了問題。更準確地說,我發現我的撇號最終爲'
,這顯然不是我想要顯示的。爲什麼Rails 2中的HTML編碼撇號會產生意想不到的結果?
任何人有任何想法,爲什麼發生這種情況?我的研究暗示HTML編碼不應該影響撇號。
這是一個有趣的問題。我看到h
又如何處理撇號AKA "'"
如何不一致。
按照RDoc的爲ERB::Util 2.6.6:
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的查找不會針對單引號/單引號進行調用。
而且,我們都知道餅乾的關鍵是撇號。 :-)
我希望如果我在您的Rails版本中查看h
或html_escape
的定義,我們會發現該字符串中包含撇號。
修復方法是升級ERB/Erubis,或覆蓋h
/html_escape
定義爲正確。您可以使用上面的定義作爲起點。
Ruby on Rails 3自動確定h
。這不再需要了。使用
<%= @post.body %>
,而不是
<%=h @post.body %>
如果你想輸出任何東西沒有逃脫它,使用raw
:
<%=raw @post.body %> <!-- For example, for use in a plaintext format */
從actionpack/lib/action_view/erb/util.rb
撇看源代碼不被編碼,只有& > < "
個字符。
我的猜測是在你的Rails應用程序中的一個庫/插件/寶石已重新定義html_escape
或HTML_ESCAPE
常數。您還應該直接在數據庫中檢查數據,以確保它在保存時尚未編碼。
我在Rails 4中有類似的問題,其中撇號顯示爲'
這個問題實際上似乎是我使用truncate
函數來顯示文本。一旦刪除,撇號按預期顯示。
在這種情況下,添加escape:false
作爲截斷選項可解決問題。
它真的輸出了''`給用戶看到什麼(即`&#39;`),或者當查看html時顯示? – 2011-02-04 15:05:21
是 - 用戶看到' – tiswas 2011-02-07 12:50:32