在我的博客应用程序中,我有一个post
模型(name:string, body:text
)。我想允许用户定义一个custom_field
(模型有名称:字符串)。这会导致post
表单包含该custom_field
的text_field,并且该字段的值应作为创建或更新的参数返回。返回的实际数据是模型 custom_field_instance (值:字符串 custom_field:引用 post:引用)
例如,如果用户创建了一个带有姓名作者的自定义字段,以及另一个带有姓名电子邮件的自定义字段,那么我希望帖子表单显示作者和电子邮件文本字段,以及两个自定义字段实例与参数一起返回(一个用于作者,一个用于电子邮件)。
自定义字段在表单中显示正常,没问题。当只有一个自定义字段时,参数看起来也很好。
问题是参数中只发送了一个自定义字段的参数。如果有多个字段,则仅发送最后一个字段的数据。
假设我有一个作者和电子邮件自定义字段,并且在新的帖子表单中,我将名称设置为"John Doe",将电子邮件设置为"john@example.com",这是我在参数中得到的内容(只有一个自定义字段实例,电子邮件实例,这是最后一个):
Parameters:
{..., "post"=>{"title"=>"post2", ...},
"custom_field_instances"=>
{"value"=>"john@example.com", "custom_field_id"=>[email_custom_field_id]},
"commit"=>"Create Post"}
这是我希望在参数中看到的内容(两个自定义字段实例:
Parameters:
{..., "post"=>{"title"=>"post2", ...},
"custom_field_instances"=>
{"value"=>"John Doe", "custom_field_id"=>[author_custom_field_id]},
{"value"=>"john@example.com", "custom_field_id"=>[email_custom_field_id]},
"commit"=>"Create Post"}
这是我到目前为止的代码:
posts_controller.rb:
def new
@post = Post.new
@custom_fields = CustomField.all
end
views/posts/new.html.erb:
<%= form_for @post,... %>
...
<% @custom_fields.each do |custom_field| %>
<% @custom_field_instance = CustomFieldInstance.new %>
<%= fields_for :custom_field_instances, @custom_field_instance do |custom_field_instance_fields| %>
<%= custom_field_instance_fields.label custom_field.name %>
<%= custom_field_instance_fields.text_field :value %>
<%= custom_field_instance_fields.hidden_field :custom_field_id, value: custom_field.id %>
<% end %> <!-- end of fields_for block -->
<% end %> <!-- end of custom_fields.each loop -->
...
<% end %> <!-- end of form_for block -->
我也尝试过没有fields_for
行变得<%= fields_for :custom_field_instances do |custom_field_instance_fields| %>
@custom_field_instance
,但它不会改变任何东西(最后一个自定义字段实例仍然是参数中发送的唯一实例)。
更新1:我也尝试使用accepts_nested_attributes_for
,但随后视图没有显示自定义字段文本字段,因为似乎nested_attributes仅用于关联模型的现有实例。这些更改是:
在上面的代码中,我向 item_instance.rb 添加了accepts_nested_attributes_for :custom_field_instances
,并在上面的视图代码中,将fields_for ...
替换为post_form.fields_for ...
将其作为Array
未经测试。
尝试1:
<%= custom_field_instance_fields.text_field, name: 'value[]' %>
或
<%= custom_field_instance_fields.text_field, 'value[]' %>
隐藏字段相同。
try2: ( 为 OP 工作 )
使用{:multiple => true}
尝试3:
serialize :name, Array
在您的CustomFieldInstance
模型中