Rails 表单不会在 select 字段之外显示新对象属性的值

Rails form won't display value of new object attribute outside of select field

在 Rails 6 应用程序中使用 SimpleForm,我有一个在父对象的新方法上多次创建的嵌套对象:

def new
    @issue = @issueable.issues.new
    @cat_patchvault = Catalog.find_by_slug("patchvault")
    @cat_bb6 = Catalog.find_by_slug("blue-book-6")
    @issue.catalog_entries.build(catalog_id: @cat_patchvault.id)
    @issue.catalog_entries.build(catalog_id: @cat_bb6.id)
    @issue.reorders.new
    @issue.issue_variations.new
    respond_with @issue
  end

这些对象全部创建并且目录条目部分被呈现并在 select 下拉列表中显示正确的目录,但是,我想更改字段集的图例以反映目录并将其移动到隐藏字段。

有问题的select:

<%= form.input :catalog_id,
               label: 'Catalog',
               as: :select,
               prompt: 'Choose Catalog',
               collection: Catalog.all.order(:name),
               label_method: lambda { |cl| "#{cl.name} #{cl.version if cl.version}"} %>

CatalogEntry 是 Issue 和 Catalog 之间的直通关系,每条记录上都有很多额外的列表数据。这是在 catalog_entry 的部分嵌套字段内,在父表单中调用:

<%= f.simple_fields_for :catalog_entries do |catalog_entry_form| %>
        <%= render "catalog_entry_fields", form: catalog_entry_form %>
      <% end %>

我尝试了几种不同的方法,包括 SimpleForm 的 as: :display ( https://github.com/heartcombo/simple_form/wiki/Create-an-%22input%22-just-for-displaying-attribute-value ) 自定义表单类型,但它们都破坏了表单。用 javascript 解决这个问题似乎是错误的方法,因为属性值已经被传入。

显示输入代码:

<%= form.association :catalog,
                        as: :display,
                        association_label: 'name',
                        label: false %> Listing

如果 association_label 被注释掉,它会 return 一个对象,例如#<Catalog:0x00007fd7829b1098>。如果不是,它 returns undefined method name' for nil:NilClass`,这很奇怪,因为那里 一个对象......

问题不在于 catalog_entry_fields。当 catalog_entry_fields 在这一行被调用时

<%= f.simple_fields_for :catalog_entries, CatalogEntry.new, child_index: 'NEW_RECORD' do |catalog_entry_form| %>
<%= render "catalog_entry_fields", form: catalog_entry_form %>

您发送给它的 Catalog 对象没有 category_id,因此当在 category_id 上调用 name 时,它 returns 为零。如果删除此行,表单将按预期显示。 您可以通过检查自定义 display_input class 中的 object 来看到这一点。
这里调用display_inputclass时:

<%= f.simple_fields_for :catalog_entries do |catalog_entry_form| %>
   <%= render "catalog_entry_fields", form: catalog_entry_form %>
<% end %>

返回的对象为 #<CatalogEntry id: nil, catalog_id: 1, issue_id: nil, issue_type_id: nil, category_id: nil, issue_number: nil, variety: nil, combined: nil, event: false, notes: nil, created_at: nil, updated_at: nil, listed_in_error: nil, issueable_id: 5, issueable_type: "Lodge", patchscan_url: nil, slug: nil>

这里调用display_inputclass时:

<%= f.simple_fields_for :catalog_entries, CatalogEntry.new, child_index: 'NEW_RECORD' do |catalog_entry_form| %>
          <%= render "catalog_entry_fields", form: catalog_entry_form %>

表单生成器返回的对象是 #<CatalogEntry id: nil, catalog_id: nil, issue_id: nil, issue_type_id: nil, category_id: nil, issue_number: nil, variety: nil, combined: nil, event: false, notes: nil, created_at: nil, updated_at: nil, listed_in_error: nil, issueable_id: nil, issueable_type: nil, patchscan_url: nil, slug: nil>,没有 catalog_id,所以 name 在 nil 上被调用,这导致了错误。