2011-03-25 28 views
6

這裏是我的代碼,我想顯示的鏈接列表中的句子形式的BBOY的船員與.to_sentenceRuby on Rails的似乎是創造的link_to自動轉義HTML

<span class="affiliation"> 
    <% if(@bboy.crews.count > 0)%> 
    <span><%= if(@bboy.crews.size > 1) then "Crew".pluralize else "Crew" end %>:</span> 
    <%= @bboy.crews.collect{|c| link_to c.name, c}.to_sentence %> 
    <% else %> 
    <em>Independent</em> 
    <% end %> 
</span> 

輸出我得到的是正確的鏈接,但它顯示爲:

<a href="/crews/1">Hustle Kidz</a> and <a href="/crews/2">Knuckleheads Cali</a> 

而不是:

Hustle KidzKnuckleheads Cali

與html轉義,而不是所需的鏈接。

我錯過了什麼嗎?我嘗試了CGI.unescapeHTML和其他一些程序,但正在迷路...

回答

2

我克萊伯接受我們,你應該將它變成幫手,因爲這是一個很大的邏輯爲視圖

def crews_description(crews) 
    if crews.empty? 
    content_tag('em', 'Independent') 
    else 
    label = "Crew" 
    label = label.pluralize if crews.size > 1 
    crews_links = crews.map {|crew| link_to(h(crew.name), crew)}.to_sentence 
    content_tag('span', label) + crews_links.html_safe 
    end 
end 

,並在您的視圖:

<span class="affiliation"> 
    <%= crews_description(@bboy.crews) 
</span> 
0

我建議您將此代碼塊移至幫助程序,然後使用.html_safe方法獲取預期結果。

+0

爲什麼要轉移到幫手? – 2011-03-25 15:55:54

20

的Rails 3現在可以自動逃逸的一切,以輸出原始的HTML使用:

<%= some_string.html_safe %> 

或本:

<%= raw @some_html_string %> 

感謝macek的提示。

有關更多詳細信息:http://markconnell.co.uk/posts/2010/02/rails-3-html-escaping

+1

太棒了,這很棒!我也只是注意到它在bboy.crews.size爲1時工作,但當它大於1時不工作......任何想法爲什麼? – 2011-03-25 15:54:44

+0

我認爲這是因爲當船員數組中只有一個元素時 - 「to_sentence」方法不會從所有鏈接創建一個ruby字符串,這就是爲什麼Rails不會將其轉義,而且通常link_to可以工作。 – 2011-03-25 16:01:33

4

你可以(也應該)你raw方法

<%= raw @some_html_string %> 
+2

對於使用raw(可以通過模板預處理器內聯,因此速度更快)而不是html_safe +1(http://yehudakatz.com/2010/02/01/safebuffers-and-rails-3-0/總結,子彈3) – 2011-03-25 17:02:37