我们的rails 3.1.0 app中有rfq,quote和test_item。 RFQ有很多报价和测试项目。引用属于rfq并且有许多测试项目。测试项目有很多rfq和引号。
创建报价时,rfq中的测试项将直接传递给报价新表单。以下是引号控制器中的新代码:
@quote = @rfq.quotes.new()
@quote.test_items << @rfq.test_items
以下是引用新表单中的视图代码,用于显示从rfq传递的测试项目:
<%= simple_form_for([@rfq, @quote]) do |f| %>
....
<% @quote.test_items.each do |t| %>
<p><%= f.association :test_items, :label => false %><%= link_to_remove_fields "remove", f %></p>
<% end %>
....
<% end %>
上面的视图代码可以显示从rfq传递的测试项并维护关联(quote有很多测试项),这是应用程序所需要的。然而,它还显示了一个测试项目的选择框,这里不需要(除了删除之外,不能更改引用中的测试项目。此外,循环中没有用)。我们需要的只是显示测试项的名称,维护关联(quote有很多测试项)并允许删除测试项(由link_to_remove_fields完成)。
有没有一种干净的方法来实现这一目标?非常感谢。
答案 0 :(得分:1)
看一下Rails中的嵌套属性机制。它需要一个模型声明accepts_nested_attributes_for,并且由fields_for表单助手支持,它们也与simple_form的simple_fields_for兼容。
我认为您的错误是您明确地遍历test_items
并致电f.assocation
,告诉表单您要选择其他test_item
。我认为您要做的是让用户通过复选框删除test_items
。您需要使用fields_for隐式循环遍历test_items
列表并使用nested_attributes来允许删除。