一次保存所有嵌套表单对象

时间:2011-02-04 08:47:17

标签: ruby-on-rails-3

我正在尝试构建两个嵌套的表单。但到目前为止我找到的所有资源都涉及如何保存主对象,可能是添加或删除嵌套对象,而不是使用表单的值将整个列表保存在其他位置。有没有办法做到这一点?

这是我正在使用的模型。我正在尝试创建一个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中提出一些验证规则,但一次只能执行一步;)

非常感谢!

1 个答案:

答案 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
模型配置

中的