我有以下代码生成发票字段
这是发票类
的edit.html.erb<% f.fields_for(:invoice_items) do |f| %>
<%= render :partial => 'invoice_items/fields', :locals => {:f => f} %>
<% end %>
我生成invoice_items作为发票对象的一部分
@invoice = Invoice.find(params[:id], :include => :invoice_items, :order =>"invoice_items.display_order")
它工作正常,但我需要将每个包装在一个div中,并将该对象的id分配给div。 (div id = i_2345 - 那种事情)所以我可以使用jQuery魔法。
我像新生驹一样磕磕绊绊的是如何访问正在调用的invoice_item的id?
我可以做一个f.text_field:id并且它给了我正确的id - 所以它知道它。但是我希望有一些我可以撒上的魔法小精灵灰尘会让它给我,而不必撕裂它。
答案 0 :(得分:20)
我找到了答案:
f.object.id
答案 1 :(得分:3)
f.index
您可能想使用f.index
而不是f.object.id
。
调用f.object.id
时,您将获取表单引用的对象的 id 。如果对象已经保存,那很好,但是有时不是(例如,在您的情况下,当您使用fields_for并为发票创建新的InvoiceItems时。那些InvoiceItems尚不存在,因此它们不存在。没有 id )
在这种情况下,Rails表单助手会创建此index
,该id=invoice_invoice_items_attributes_1586974556130_display_order
用于在数组内传递多个对象而不会覆盖任何内容。
这就是为什么如果您检查表格的原因,您可能会看到输入内容和ID如:
name=invoice[invoice_items_attributes][1586974556130][display_order]
和类似这样的名称:
f.index
数字 1586974556130 此处是rails创建的索引,因此它可以发送带有数组中多个invoice_items_attributes的表单。
但是,如果保存了对象,则[invoice_items_attributes][1]
将返回该对象的ID,因此它将创建适当的标签,例如$("#invoice_invoice_items_attributes_<%= f.index %>_display_order")
。您应该改为调用f.index,它将在保存对象时返回对象的ID,否则,它将返回rails创建的索引。
您的jQuery向导可以访问此:
<div class="row">
<div class="col-md-12">
<div class="card-body">
<ngx-extended-pdf-viewer
[src]="pdfSrc"
[useBrowserLocale]="true"
[textLayer]="true"
[showHandToolButton]="true"
[height]="'100vh'">
</ngx-extended-pdf-viewer>
</div>
</div>
</div>
参考:https://api.rubyonrails.org/v6.0.2.1/classes/ActionView/Helpers/FormBuilder.html
希望有帮助!