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 动态生成的 fields_for 不会被 form_tag 作为输入