如何在<%=%>中输出html_safe连接字符串时阻塞?

时间:2012-04-19 16:15:15

标签: ruby-on-rails ruby ruby-on-rails-3

考虑一下:

<%
str = "http://domain.com/?foo=1&bar=2"
%>

现在这些情况:

<%=str%>
# output:http://domain.com/?foo=1&amp;bar=2

<%=str.html_safe%>
# output:http://domain.com/?foo=1&bar=2

<%="#{str.html_safe}"%>
# output:http://domain.com/?foo=1&amp;bar=2

<%=""+str.html_safe%>
# output:http://domain.com/?foo=1&amp;bar=2

我需要输出带有其他字符串的URL。我怎样才能保证&符号不被转义?由于我无法控制的原因,我无法发送&amp;

请帮忙!把头发拉到这里:\

编辑:为了澄清,我实际上有一个像这样的数组:

@images = [{:id=>"fooid",:url=>"http://domain.com/?foo=1&bar=2"},...]

我正在以这种方式在我的应用中创建一个JS数组(image_array var):

image_array.push(<%=@images.map{|x|"{id:'#{x[:id]}',url:'#{x[:url].html_safe}'}"}.join(",")%>);

这会产生:

image_array.push({id:'fooid',url:'http://domain.com/?foo=1&amp;bar=2'},...);

在我的具体情况下哪个不起作用。我需要url而没有amp;部分。

4 个答案:

答案 0 :(得分:7)

当你写:

"#{foo.bar}"

这相当于写作

foo.bar.to_s

所以你实际做的是:

<%=str.html_safe.to_s%>

...... Rails不再认为它是安全的,所以它会通过一轮HTML转义命中你的结果字符串。

我不知道Rails的内部结构,但是我假设html_safe方法扩展了字符串对象,并将实例变量标记为OK,但是当你通过插值将其包装在另一个字符串中时你得到一个没有那个标志的新字符串。

修改:要满足您的需求,请使用raw或在最终字符串上调用html_safe

<%=raw "foo#{str}"%>
<%="foo#{str}".html_safe%>

或在你的情况下:

image_array.push(<%=raw @images.map{…}.join(',')%>);
image_array.push(<%=@images.map{…}.join(',').html_safe%>);

另请参阅this question

答案 1 :(得分:2)

使用此

    <%=str.html_safe.to_s%>

   <%=raw(str)%>   

给你更好的结果

答案 2 :(得分:0)

image_array.push(<%= @images.map{|x| "{id:'#{x[:id]}',url:'#{x[:url]}'}".html_safe }.join(",") %>);

答案 3 :(得分:0)

为了安全起见,您要做的是:

image_array.push(<%= @images.map { |image| image.as_json(only: [:id, :url]) }.to_json } %>)

这样可以正确地逃脱<>等:

[{"name":"\u003ch1\u003eAAAA\u003c/h1\u003e"}]

对于像我这样想串起来的人来说,这样做并不安全,最好的方法是串接标签,例如

    content_tag(:p) do
      content_tag(:span, "<script>alert(1)</script>") +
        link_to("show", user)
    end

可以正常工作,并且可以正确转义第一个字符串