form_tag:在 params[] 中保留许多 text_filed_tag 的值

Posted

技术标签:

【中文标题】form_tag:在 params[] 中保留许多 text_filed_tag 的值【英文标题】:form_tag: keep values of many text_filed_tag in params[] 【发布时间】:2021-10-10 16:53:19 【问题描述】:

我有以下 form_tag:

  - @invoice_data.each do |data|
    %br
    = label_tag "Description"
    %br
    = text_field_tag 'item[description]', data.position
    %br
    = label_tag 'Quantity'
    %br
    = text_field_tag 'item[quantity]', data.num_event
    %br
    = label_tag 'Single Preis'
    %br
    = text_field_tag 'item[single_preis]', data.billable_fees / data.num_event
    %br
    = label_tag 'Vat Percent'
    %br
    = text_field_tag 'item[vat_percent]', "19"
  %br
  %div
    %br
    = submit_tag "add", class: 'btn btn-sm btn-default', style: 'margin-left: 5px; margin-top: -2px', type: 'submit'

form_tag 创建的字段数与 @invoice_data 中的记录数一样多(这是查询的结果),但在 提交 我的 params []只存储@invoice_data的最后一条记录:<ActionController::Parameters "utf8"=>"✓", "item"=><ActionController::Parameters "description"=>"Payment 4", "quantity"=>"1", "single_preis"=>"$0.26", "vat_percent"=>"19" permitted: true>, "commit"=>"add", "controller"=>"comercio", "action"=>"send_invoice", "id"=>"1" permitted: true>

我应该怎么做才能在 params[] 中存储@invoice_data 中的所有记录,而不仅仅是最后一条?

非常感谢您!

【问题讨论】:

【参考方案1】:

Rails 创建 necord 和嵌套子级的方法是使用嵌套属性:

class Invoice < ApplicationRecord
  has_many :items
  accepts_nested_attributes_for :items
end

class Item < ApplicationRecord
  belongs_to :invoice
end
= form_with(model: @invoice) do |form|
  = form.fields_for :items do |item|
    = item.text_field :description
    = item.nhumber_field :quantity

处理从查询到项目实例的任何类型的疯狂映射不是您视图的工作。它应该在其他地方处理,例如控制器或服务对象:

class InvoicesController
  def new  
    invoice_data = get_it_from_somewhere
    @invoice = Invoice.new do |i|
      invoice_data.each do |raw|
        i.items.new(
          description: data.position,
          # ...
        )
      end
    end   
  end

  def create 
    @invoice = Invoice.new(invoice_params)
    if @invoice.save
      redirect_to @invoice
    else
      render :new
    end
  end

  private 
  
  def invoice_params
    params.require(:invoice)
          .permit(:foo, :bar, items_attributes: [ :description, :quantity, ...])
  end
end

【讨论】:

嗨,马克斯。非常感谢您的回复。只是为了完全理解你的代码行,我有一些新手问题:我必须创建一个 Items 模型吗?还是我必须在发票模型中创建一个项目列? ...因为在这一行i.items.new(... 我收到了这个错误:uninitialized constant Invoices::Item 和最后一个:form_with 是一种替代方案或 form_tag 也可以使用?再次感谢! 是的,你应该创建一个 Item 模型。

以上是关于form_tag:在 params[] 中保留许多 text_filed_tag 的值的主要内容,如果未能解决你的问题,请参考以下文章

在 form_tag 表单中使用 jquery_datepicker

使用 js/jquery 在 ruby​​ on rails 中隐藏 form_tag 上的提交按钮

rails视图按各种类别排序模型

Rails 动态生成的 fields_for 不会被 form_tag 作为输入

form_tag不会将动态生成的fields_for用作输入

在 iOS 应用程序中保留许多图像