防止Rails将特殊字符转换为HTML实体

7
我正在使用以下辅助函数,但它似乎将JavaScript语句中的所有特殊字符转换为HTML实体,使其无用且错误。有什么建议吗?
 def link_to_add_fields(name, f, association)
    new_object = f.object.class.reflect_on_association(association).klass.new
    fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
      render(association.to_s + "_fields", :f => builder)
    end
    link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))
  end

上述代码生成的链接如下(请注意将 $amp; 转换为 " 等):
<a href="#" onclick="add_fields(this, &amp;quot;skills&amp;quot;, &amp;quot;&amp;lt;label for=\&amp;quot;user_skills_attributes_new_skills_name\&amp;quot;&amp;gt;Skill&amp;lt;\/label&amp;gt;\n&amp;lt;input data-autocomplete=\&amp;quot;/users/autocomplete_skills_vocab_name\&amp;quot; id=\&amp;quot;user_skills_attributes_new_skills_name\&amp;quot; name=\&amp;quot;user[skills_attributes][new_skills][name]\&amp;quot; size=\&amp;quot;30\&amp;quot; type=\&amp;quot;text\&amp;quot; /&amp;gt;&amp;lt;br /&amp;gt;\n&amp;lt;input id=\&amp;quot;user_skills_attributes_new_skills__destroy\&amp;quot; name=\&amp;quot;user[skills_attributes][new_skills][_destroy]\&amp;quot; type=\&amp;quot;hidden\&amp;quot; value=\&amp;quot;false\&amp;quot; /&amp;gt;&amp;lt;a href=\&amp;quot;#\&amp;quot; onclick=\&amp;quot;remove_fields(this); return false;\&amp;quot;&amp;gt;remove&amp;lt;\/a&amp;gt;&amp;quot;); return false;">Add a Skill</a>

编辑/

弄清楚了--对于Rails 3,删除h()


2
你是不是不知道它是如何工作就将其复制了?提示:h()函数有什么作用? - Mark Thomas
说实话,我正在使用Railscasts的一集中的代码:http://railscasts.com/episodes/197-nested-model-form-part-2 我删除了h(),现在它可以工作了?我对为什么在Railscast中使用它感到困惑... - stewart715
嗯,我认为这是Rails 3的问题 - 感谢马克的快速修复。 - stewart715
考虑更新正确的代码 ;) - Alexey
1个回答

7
在Rails 2中,默认情况下不会转义输出内容。h()方法可以实现这一点。在Rails 2的视图中,您经常会看到以下内容:
<%=h @object.field %>

然而,在Rails 3中,默认情况下输出是经过转义的。您不再需要使用h()方法。为了获得未经转义的输出,您必须使用raw方法。
更多信息请参见:http://railscasts.com/episodes/204-xss-protection-in-rails-3 所以基本上在您的情况下,您正在查看Rails 2代码,并且需要删除h()以将其更新为Rails 3。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接