我是 RoR 的新手,我正在关注这个railscast,它解释了如何在嵌套表单中删除和添加元素。就我而言,我试图允许用户从购物“列表”中添加/删除“项目”。然而,不幸的是,当我在浏览器中单击“添加项目”时,HTML 被打印出来,而不是被渲染。这是它的输出:
<div class ="fields"> Quantity: <input id="list_items_attributes_1315942810959_quantity" name="list[items_attributes][1315942810959][quantity]" size="7" type="text" /> Name: <input id="list_items_attributes_1315942810959_name" name="list[items_attributes][1315942810959][name]" size="30" type="text" /> Category: <select id="list_items_attributes_1315942810959_category" name="list[items_attributes][1315942810959][category]"><option value="Produce">Produce</option> <option value="Dairy">Dairy</option></select> <p><input id="list_items_attributes_1315942810959__destroy" name="list[items_attributes][1315942810959][_destroy]" type="hidden" value="false" /><a href="#" onclick="remove_fields(this); return false;">remove</a></p> </div>
Add Item
我觉得我错过了一些简单的东西。我可以打开一些开关来渲染它吗?谢谢!
如果有帮助,这是我的列表模型:
class List < ActiveRecord::Base
has_many :items, :dependent => :destroy
accepts_nested_attributes_for :items, :reject_if => lambda { |a| a[:name].blank?}, :allow_destroy => true
belongs_to :user
end
这是我将项目添加到列表的简短形式:
<%= form_for @list do |f| %>
<p>
<%= f.label :date %>
<%= f.date_select :date %>
</p>
<%= f.fields_for :items do |builder|%>
<%= render "item_fields", :f => builder %>
<% end %>
<p><%= link_to_add_fields "Add Item", f, :items %></p>
<%= submit_tag "Create List" %>
<% end %>
这是我的应用程序助手中的 link_to_add_fields 方法(它是来自 railscast 的逐字副本):
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.singularize + "_fields", :f => builder)
end
link_to_function(name, h("add_fields(this, '#{association}', '#{escape_javascript(fields)}')"))
end
最后,这是我的 application.js 文件中的 add_fields 函数:
function add_fields(link, association, content) {
var new_id = new Date().getTime();
var regexp = new RegExp("new_" + association, "g")
$(link).up().insert({
before: content.replace(regexp, new_id)
});
}