如何使用 Rails 在一个表单中添加多个单名元素?

Posted

技术标签:

【中文标题】如何使用 Rails 在一个表单中添加多个单名元素?【英文标题】:How to add multiple single-name elements in one form with Rails? 【发布时间】:2015-10-10 15:24:14 【问题描述】:

我有三个模型需要一起工作 - productline_productorder,其中 line_product 镜像 productorder。所以它看起来像这样:

product.rb

has_many :line_products

order.rb

has_many :line_products

line_product.rb

belongs_to :order
belongs_to :product

我想制作一个表格,其中有一个产品列表,每个产品旁边都有一个输入字段,用户可以为任何产品输入任何数字(计数),点击提交,所有产品的计数超过0 在他们的形式中,将成为line_productsorder 其中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'

【问题讨论】:

【参考方案1】:

您正在达到预期的行为。这实际上是 Rails 表单处理未选中复选框的方式。这实际上更像是一个 HTTP 表单发布问题,使用 rails / haml 生成 html 不是问题。

使用数组形式POST an array from an HTML form without javascript

【讨论】:

【参考方案2】:

有很多方法可以处理这个问题,例如,您可以使用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 对象

【讨论】:

以上是关于如何使用 Rails 在一个表单中添加多个单名元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 表单选择标签中添加数据属性?

Rails:一个表单中的多个提交按钮

在 Rails 6 中使用 activestorage 时,如何在重新显示表单时保留文件?

Rails - 如何向用 javascript 创建的表单添加 CSRF 保护?

通过复选框Rails 4添加多个嵌套属性(可能有多种形式)

SortableJS + Rails 表单的更新位置