Ruby - 通过输入值嵌套对象

时间:2013-05-17 22:28:09

标签: ruby

你好我的同伴!

我想要实现的是一个系统,通过这种系统可以用两种方式编译订单:

  1. 通过填写自己的属性(:sender_name,:sender_mobile等...)
  2. 通过附在其上的价格标签选择产品。
  3. 经过一段时间的努力,我设法在订单上显示产品清单。这里有3个模型和视图

    模型/ order.rb

    class Order < ActiveRecord::Base
      attr_accessible :sender_comment, :sender_email, :sender_mobile, :sender_name, :order_attributes
    
      has_many :products
    
      accepts_nested_attributes_for :products
    end 
    

    模型/ product.rb

    class Product < ActiveRecord::Base
        belongs_to :order
        attr_accessible :product_name, :product_description, :prices_attributes, :order_id
    
        has_many :prices
    
        accepts_nested_attributes_for  :prices
    end
    

    模型/ price.rb

    class Price < ActiveRecord::Base
        belongs_to :product
    
        attr_accessible :product_id, :price_label, :price_amount, :price_checked, :how_many_prices, :products_attributes
    end
    

    视图/命令/ _form.html.erb

    <%= form_for(@order) do |f| %>
      <div class="field">
        <%= f.label :sender_name %><br />
        <%= f.text_field :sender_name %>
      </div>
    
      # [...] other order's fields... 
    
      <%= f.fields_for :product do |builder|  %>
        <%= render "products_field", :f => builder %>
      <% end %>
    
      <div class="actions">
        <%= f.submit %>
      </div>
    <% end %>
    

    视图/命令/ _products.html.erb

    <% @products.each do |p| %>
        <td><%= p.product_name %></td>
    <td><%= p.product_description %></td><br />
            <% p.prices.each do |price| %>
                <td><%= price.price_label %></td><br />
                <td><%= price.price_amount %></td><br />
                <td><input type="radio" class="order_bool" name="<%= p.product_name %>" <% if price.price_checked == true; puts "SELECTED"; end %> value="<%= price.price_amount%>"/></td><br />
            <% end %>
    <% end %>
    

    产品和亲属价格在订单表格中打印,但一旦选择,它们就不会保存为order_attributes;连同订单的属性,所选的每个收音机都会生成一个像这样的对象

    [#<Product id: nil, order_id: 23, product_name: nil, product_description: nil, created_at: nil, updated_at: nil>]
    

    如何将所选产品转换为有效的order_attributes?

    这是我与OOP的第一个项目,我自己学习,只有很少的帮助,但来自互联网。请不要太苛刻!

    如果您认为不合适,也可随意更改标题;英语不是我的母语,我发现很难用几句话来回顾这个问题。

    感谢病人:)

1 个答案:

答案 0 :(得分:0)

基本上,您当前的_products_fields部分甚至没有附加到form对象。你现在正在构建任意输入。请参阅form_for documentationfields_for documentation以及radio_button documentation

注意:当您使用f.method_name时,您实际上将调用该方法的FormBuilder versions而不是FormHelper版本。由于FormHelper版本具有更多且仍然相关的文档,因此版本更好。只需省略object_name参数。

我认为改变这些行应该可以解决问题:

表格部分:

<%= f.fields_for :products, @products do |builder|  %>
    <%= render "products_field", :f => builder %>
<% end %>

产品字段部分

# 'f' is the variable passed in using ':f => builder'
# So 'f' = builder

# f.object is accessing the object were building the fields for
<td><%= f.object.product_name %></td>
<td><%= f.object.product_description %></td><br />
<% f.object.prices.each do |price| %>
  <td><%= price.price_label %></td><br />
  <td><%= price.price_amount %></td><br />
  <td><%= f.radio_box("price", price.price_amount %></td><br />
<% end %>