用户通过Rails应用程序中的文本字段转义撇号输入?

时间:2009-10-12 22:31:19

标签: javascript ruby-on-rails xhtml escaping

更新:

如果您查看我在下面的更新中粘贴的javascript代码,我会在variety.name变量周围添加单引号。我想我只是按照教程来做这件事。事实证明,当我将它们切换为双引号时,一切正常。问题:这是一个稳定的解决方案吗?或者,实施escape_javascript助手仍然会更好吗?
我有一个Rails应用程序,用户可以在其中输入字段的值。然后,其他用户可以通过从下拉列表中选择该值来将该值添加到其配置文件中。我正在使用collection_select助手来渲染下拉列表。我有一些与这个下拉列表绑定的javascript,它识别父选择,然后显示某个子选择。

问题是某些用户正在输入包含撇号的值。 Firebug告诉我撇号打破了javascript。当我手动删除所有撇号进行测试时,javascript功能完美。

今天早些时候,我问了一个关于在渲染的html文本中转换&符号的问题,现在我知道你使用<%= h%>。根据我在网上看到的内容,<%= h%>不逃避撇号。如果我错了并且<%= h%>我不知道如何使用collection_select实现它,因为我尝试了许多组合,但没有一个能够工作。

以下是创建下拉列表的代码行:

<%= season_form.collection_select :variety_id, Variety.find(:all), :id, :name, :prompt => "Optional: Variety" %>

谢谢!

更新

这是我的javascript。我有一个商品层次。作为解释:此javascript允许我的用户从下拉列表中选择产品,然后自动将第二个下拉列表限制为仅属于用户选择的任何产品的那些品种。它的效果很好,只要品种名称中没有撇号。

另外,我尝试在几乎所有元素前添加escape_javascript,但没有一个解决了问题。 Rails文档在这个帮助器上是不存在的,因此在示例方面没有太多可继续性。谢谢你的帮助!

var varieties = new Array();
<% for variety in @varieties -%>
  varieties.push(new Array(<%= variety.product_id %>, '<%=h variety.name %>', <%= variety.id %>));
<% end -%>

function collectionSelected(e) {
  product_id = e.getValue();
  options = e.next(1).options;
  options.length = 1;
  varieties.each(function(variety) {
    if (variety[0] == product_id) {
      options[options.length] = new Option(variety[1], variety[2]);
    }
  }); 
}

2 个答案:

答案 0 :(得分:0)

编辑:

我刚刚意识到你不应该在你的服务器端代码中逃脱。你应该逃避javascript代码。有关javascript转义功能,请参阅此处:http://www.w3schools.com/jsref/jsref_escape.asp

你应该在api中使用escape_javascript(): http://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html#M001758

答案 1 :(得分:0)

您可以使用gsub并替换您想要的内容。

我通常使用select helper并将其传入。我不认为collection_select使用它。

Variety.all.collect{|v| [v.id, v.name.gsub("'", "\'")]}

对于collection_select,您可以在使用之前“修复”记录。

varieties = Variety.all.map{|v| v.name.gsub("'", "\'")}
collection_select(:variety_id, varieties, :id, :name, :prompt => "Optional: Variety")