我的用户/编辑页面上有一组依赖的下拉菜单。用户选择父下拉列表,然后限制子下拉列表中的可用选择。用户可以添加多组额外的父/子下拉列表。产品是父母。多样性就是孩子。
除非在数据库中输入包含双引号的变体,否则这一切都很有效。当发生这种情况时,它会破坏javascript,并且渲染部分的触发器根本不起作用。
单引号不会导致此问题,也不会导致我尝试过的任何其他字符。所以这个问题特定于双引号。我认为escape_javascript就是这里的答案,但我已经尝试将它放在代码中的许多不同位置并且没有任何效果。我很可能不确切知道助手及其括号应该去哪里。
api文档非常糟糕。它说escape_javascript()。这对我没有帮助。同样,网上没有太多明确的指导。我搜索了几个小时。
以下是我的代码的相关部分:
用户#edit.html.erb
<%= render :partial => 'season', :collection => @user.seasons %>
用户#_season.html.erb
<% fields_for prefix, season do |season_form| -%>
<%= error_messages_for :season, :object => season %>
Product: <%= season_form.collection_select :product_id, Product.find(:all, :order =>'name'), :id, :name, {:prompt => "Select Product"}, {:onchange => "collectionSelected(this);"} %>
<% varieties = season.product ? season.product.varieties : Variety.all %>
<%= season_form.select :variety_id, options_from_collection_for_select(varieties, :id, :name, season.variety_id), :prompt => "This is optional" %>
Javascripts#dynamic_varieties.js.erb
var varieties = new Array();
<% for variety in @varieties -%>
varieties.push (new Array (<%=h variety.product_id %>, "<%=h variety.name %>", <%=h 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]);
}
});
}
答案 0 :(得分:1)
假设你只是做了一些逃避错误(并且rails正确地做了),你可以尝试类似的东西:
var varieties = <%= @varieties.map { |v| [v.product_id, h(v.name), v.id] }.to_json %>