2011-03-25 22 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