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

mga*_*mga 5 ruby ruby-on-rails ruby-on-rails-3

考虑一下:

<%
str = "http://domain.com/?foo=1&bar=2"
%>
Run Code Online (Sandbox Code Playgroud)

现在这些情况:

<%=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
Run Code Online (Sandbox Code Playgroud)

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

请帮忙!拉我的头发在这里:

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

@images = [{:id=>"fooid",:url=>"http://domain.com/?foo=1&bar=2"},...]
Run Code Online (Sandbox Code Playgroud)

我正在创建一个JS数组(image_arrayvar)以这种方式在我的应用程序中使用:

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

这会产生:

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

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

Phr*_*ogz 8

当你写:

"#{foo.bar}"
Run Code Online (Sandbox Code Playgroud)

这相当于写作

foo.bar.to_s
Run Code Online (Sandbox Code Playgroud)

所以你实际做的是:

<%=str.html_safe.to_s%>
Run Code Online (Sandbox Code Playgroud)

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

我不知道Rails的内部,但我假设该html_safe方法使用实例变量扩展字符串对象,将其标记为OK,但是当您通过插值将其包装在另一个字符串中时,您将获得一个没有该标志的新字符串.

编辑:要满足您的需求,请使用raw或调用html_safe最终字符串:

<%=raw "foo#{str}"%>
<%="foo#{str}".html_safe%>
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下:

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

另见这个问题.