我有三个需要协同工作的模型 - product
,line_product
和order
,其中line_product
为product
镜像order
。所以它看起来像这样:
product.rb
has_many :line_products
order.rb
has_many :line_products
line_product.rb
belongs_to :order
belongs_to :product
我想制作一个表单,其中有一个产品列表,每个产品旁边都有一个输入字段,用户可以为任何产品输入任意数量(计数),点击提交,所有产品的数量都超过如果line_products
(例如)order
,则表单中的0将变为order.id: 1
。截至目前,只有最后一个产品被添加到订单中。
我怎么能这样做?
修改
表单如下:
= form_for @line_product do |lp|
= lp.hidden_field :order_id, value: Order.last.id
%section#product_list
- if notice
%section.notice=notice
%ul#products
-@products.each do |p|
%li.product_list
%article.product
%section.product_left
= image_tag p.image.url(:medium)
%div.clear
%span.price= number_to_currency(p.price,:unit=>'€ ')
%section.product_right
%section.product_about
%span.title= p.title
%span.description= p.description
%span.description.desceng= p.description_eng
= lp.hidden_field :product_id, value: p.id
%section.product_order
= lp.number_field(:count, min: '0', value: '', class: 'product_count')
%section#order_accepting
= lp.submit "Add to cart", class:'add_to_cart'
答案 0 :(得分:0)
您正在达到预期的行为。这实际上是rails表单处理未选中的复选框的方式。实际上这更像是一个HTTP表单帖子问题,使用rails / haml生成HTML不是问题。
答案 1 :(得分:0)
有很多方法可以解决这个问题,例如,您可以沿着使用accepts_nested_attributes
的路线前进,这是生成创建/编辑多个对象然后处理该数据的表单的一种相当通用的方法。
对于这种特殊情况,一个稍微简单的替代方法是为每个产品生成一个数字输入(而不是您拥有的一对隐藏输入和数字输入)
number_field_tag "count[#{product.id}]"
这将导致params[:count]
成为表单
{ "1" => 23, "2" => "", "3"=> "1"}
假设您有3个产品ID为1,2,3且您输入的数量为第一个数量为23个,最后一个数量为1个。
然后,您需要一些控制器代码来迭代此哈希并构建相应的line_product对象