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_input
class时:
<%= 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_input
class时:
<%= 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 上被调用,这导致了错误。
在 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_input
class时:
<%= 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_input
class时:
<%= 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 上被调用,这导致了错误。