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
整个方案有效,除了我的方法只被调用一次,对于表单提交时的第一个属性,而不是每个属性一次。
我正在绞尽脑汁......似乎非常简单,但是做这样的事情的标准轨道方式是什么?
谢谢!
答案 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 %>
希望这有帮助。