Rails简单表单关联所有可能的对象

时间:2016-08-12 16:27:57

标签: ruby-on-rails simple-form simple-form-for

我尝试为产品/购物车方案设置simple_form,但与典型方案略有不同。我的显示器需要列出所有可用的产品,并为每个产品提供数量输入。保存后,cart_items应仅为那些提供了数量的项目存储cart_idproduct_idqty。如果它为空或零,则不应将其添加到cart_items

购物车:

class Cart < ApplicationRecord
  has_many :cart_items
  has_many :products, through: :cart_items
  accepts_nested_attributes_for :cart_items
end

购物车项目:

class CartItem < ApplicationRecord
  belongs_to :cart
  belongs_to :product
end

产品:

class Products < ApplicationRecord
  has_many :cart_items
  has_many :carts, through: :cart_items
end

我试图让我的表单显示如下: [ x ] (Qty) Product Name [ x ] (Qty) Product Name [ x ] (Qty) Product Name [ x ] (Qty) Product Name

我不确定如何使用f.association :cart_items, collection: Products.all()为qty获取额外字段,我试过了:

<%= f.simple_fields_for :cart_items do |fa| %>
    <%= fa.association :product, as: :select %>
    <%= fa.input :qty %>
<% end %>

但是,它只显示现有的关联,并且还会在选择列表中显示产品,而我只想列出所有产品并显示其关联的数量。

是否有一个漂亮而漂亮的&#34; Rails-y&#34;这样做的方式我忽略了,还是我需要在我的控制器和视图中做一些更多的手动操作?我使用Rails 5。

1 个答案:

答案 0 :(得分:1)

我怀疑没有特别的&#34; Rails-y&#34;方式,或者我不知道它。我认为您必须遍历所有产品并在simple_fields_for标记之前为缺失的产品构建cart_items。如果已有产品的购物车商品,则只显示;否则,首先构建它然后显示。

如果缺少数量,您还必须添加对cart_items的拒绝。像这样:

accepts_nested_attributes_for :cart_items, reject_if: lambda { |ci| ci[:qty].blank? || ci[:qty].zero? }

这应该可以解决问题。