在form_for或fields_for中获取对象的id

时间:2010-01-20 13:57:06

标签: ruby-on-rails

我有以下代码生成发票字段

这是发票类

的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 - 所以它知道它。但是我希望有一些我可以撒上的魔法小精灵灰尘会让它给我,而不必撕裂它。

2 个答案:

答案 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

希望有帮助!