你好我的同伴!
我想要实现的是一个系统,通过这种系统可以用两种方式编译订单:
经过一段时间的努力,我设法在订单上显示产品清单。这里有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的第一个项目,我自己学习,只有很少的帮助,但来自互联网。请不要太苛刻!
如果您认为不合适,也可随意更改标题;英语不是我的母语,我发现很难用几句话来回顾这个问题。
感谢病人:)
答案 0 :(得分:0)
基本上,您当前的_products_fields
部分甚至没有附加到form
对象。你现在正在构建任意输入。请参阅form_for
documentation和fields_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 %>