我正在尝试构建两个嵌套的表单。但到目前为止我找到的所有资源都涉及如何保存主对象,可能是添加或删除嵌套对象,而不是使用表单的值将整个列表保存在其他位置。有没有办法做到这一点?
这是我正在使用的模型。我正在尝试创建一个pc配置器,它允许您选择不同的组件和数量,然后您将添加到购物篮。
所以我正在使用三种型号。 Configuration, Configoption, Item
。
- 配置模型
has_many :configoptions
- 配置模型
belongs_to :configuration
has_many :items
def range
a = []
b = self.quantity_rng.scan(/\w/)
b.each do |p|
a << p.to_i
end
return a
end
- 项目模型
belongs_to :configoption
scope :sorted, order('items.position ASC')
这个想法是每个配置都有一组选项,比如说5.对于这5个选项中的每一个,都可能有许多可用的项目。例如,选项1是处理器,2可以是RAM,等等。
- 配置控制器
def list
@configurations = Configuration.find(:all)
end
def show
@configuration = Configuration.find(params[:id])
@options = @configuration.configoptions
end
- 配置/显示视图
<table>
<tr>
<th>Elements</th>
<th>Quantity</th>
</tr>
<%= form_for(:configuration, :remote => true) do |p| %>
<% @options.each do |option| %>
<tr>
<%= form_for(:option, :remote => true) do |f| %>
<% if option.items.count > 1 %>
<th id="<%= option.name %>"> <%= f.select option.name, options_from_collection_for_select(option.items.sorted, 'id', 'name')%></th>
<% else%>
<th id="<%= option.name %>"> <%= f.label(option.items[0].name) %></th>
<% end %>
<% if option.quantity_rng == nil %>
<th id="<%= option.name + "_qty" %>"> <%= f.label(option.quantity) %></th>
<% else%>
<th id="<%= option.name %>"> <%= f.select option.name, option.range, :selected => option.quantity%></th>
<% end %>
<% end %>
<% end %>
</tr>
<% end %>
</table>
到目前为止,事情实际上是好的,我可以给选项提供不同的项目和.range方法让我在一个选项“1,2,3”中说quantity_rng并将它变成数组[1,2,3]如果需要,可以通过下拉列表。
但是现在是关键部分,实际上我将我选择的内容添加到篮子中。如何捕获用户在下拉列表中操作的内容并将其存储(不是作为配置本身的更改,而是作为其他地方的新对象?)
BTW我正在使用remote => true
,因为我打算稍后从jQuery中提出一些验证规则,但一次只能执行一步;)
非常感谢!
答案 0 :(得分:0)
可能我不太了解你的想法,但我需要使用p.fields_for作为嵌套选项。看看http://apidock.com/rails/v3.0.0/ActionView/Helpers/FormHelper/fields_for并点击忘记定义
def address_attributes=(attributes)
# Process the attributes hash
end
模型配置中的