rails动态嵌套表单数据选择

时间:2011-09-26 04:57:02

标签: ruby-on-rails ruby-on-rails-3

Rails大师,你知道我一直在努力解决这个问题的标准解决方案吗?

在我的应用中,用户可以定义其对象的属性。因此,在生成对象列表(假设它们是书籍)之前,他可以指定他关心的属性及其潜在价值,然后对于每本书,他必须为每个属性输入合法值。所以说我投入了我的财产:长度(合法值“长”,“短”)和难度(“容易”,“硬”)。在不同的书架上,不同的书籍列表可以具有不同的属性(cover_color“blue”或“red”)

所以现在我的书形式。 “在这个书架上添加新书。”在局部,我想出了与这本书架上的新书相关的属性列表(长度和难度)。然后我查找每个属性的合法值。我有一个选择下拉列表,用户可以在其中选择一个:

<% for prop in @book.properties %>

<%= prop %> :

<%= f.collection_select :prop_value_select, prop.legal_property_values, :id, :name %>

<%end %>

在我的书模型中,我定义了一个虚拟属性,它将创建“连接记录”PropertyValue。 PropertyValue具有legal_property_value_id和book_id。

def prop_value_select=(incoming_id_from_form)
    PropertyValue.create!(:legal_property_value_id => incoming_id_from_form, :book=> self)
end

整个方案有效,除了我的方法只被调用一次,对于表单提交时的第一个属性,而不是每个属性一次。

我正在绞尽脑汁......似乎非常简单,但是做这样的事情的标准轨道方式是什么?

  • 将所有属性收集到一个数组中,并将模型生成为回调?
  • 每个属性的部分魔法?

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为问题在于您使用的是嵌套模型,并且您的所有字段都具有相同的ID,因此rails只会存储一个嵌套元素。

您应该使用允许您处理嵌套模型的fields_for。 首先,您需要在模型中指定它将接受嵌套属性。添加以下行

class Book
  has_many :properties
  accept_nested_attributes_for :properties
end

并且在您的视图中,您会写出类似

的内容
<% fields_for :properties do |prop| %>
  <%= prop %> :
  <%= f.collection_select ...
<% end %>

希望这有帮助。