有问题的应用程序利用jQuery来执行ajax请求,以便填充相关的选择框。我的控制器操作responds_to:js,在.js.erb文件中我有:
str += '<%= f.select field.name, list, {}, { :class => "list", :multiple => "multiple", :style => "size:8; width:100px;" } %>';
“list”的填充方式如下:
str += '<% list = @validation_model.lookup([field], @lookup) %>';
我是.append()把这个给了div。在.js.erb模板文件的末尾。但是,当“list”包含多个值时,模板的解析将失败。如果它为空,或者只包含一个值,则解析成功。
这是我遇到的错误,还是我做错了什么?请注意,这显示为解析错误而不是运行时错误,因此我无法准确确定Firebug或Safari Dev中的问题。
更新:这是.js.erb文件的完整代码。我用内联逻辑替换了“list”变量来检索数组。
str = '<% fields_for :mapapps do |f| %>';
<% for tf in @tag.tag_fields.find(:all, :order => :sequence) %>
<% field = tf.parentfield %>
<% if !@lookup.include?(field) %>
$("#<%= field.name %>").remove();
<% else %>
<% next %>
<% end %>
str += '<div id="<%= field.name %>" class="floater">';
str += '<label for="mapapps_<%= field.name %>"><%= field.label %></label>';
str += '<%= f.select field.name, @validation_model.lookup([field], @lookup), {}, { :class => "list", :multiple => "multiple", :style => "size:8; width:100px;" } %>';
str += '</div>';
<% end %>
str += '<% end %>'
$("#mfrsdiv").append(str);
答案 0 :(得分:1)
我认为你的印象是,eruby项目可以附加到字符串中,并将在视图中计算。实际上,eruby项目是在.js.erb文件本身中计算的,然后附加到字符串中。在你的代码中,f必须是视图中的表单变量..在.js.erb文件中没有值。如果你真的想将这个select添加到表单中,你应该考虑使用Ajax。
答案 1 :(得分:0)
我让代码正常工作。我需要做的就是在调用f.select时放入“escape_javascript”。
str += '<%= escape_javascript(f.select field.name, @validation_model.lookup([field], @lookup), {}, { :class => "list", :multiple => "multiple", :style => "size:8; width:100px;" }) %>';
应该注意的是,上面我的问题中的代码仍然会因为rubyprince提到的原因而失败,但渲染问题本身是由escape_javascript解决的。