在我的博客应用程序中,我有一个post
模型(name:string, body:text
)。我想允许用户定义custom_field
(模型具有名称:字符串)。这会导致post
表单包含custom_field
的text_field,并且该字段的值应作为创建或更新的参数返回。返回的实际数据是model_field_instance模型(值:string custom_field:references post:references)
例如,如果用户创建了名称为作者的自定义字段,以及另一个名称为电子邮件的自定义字段,那么我希望帖子表单显示作者和电子邮件文本字段,以及与params一起返回的两个自定义字段实例(一个用于作者,一个用于电子邮件)。
自定义字段在表单中显示正常,没问题。当有一个自定义字段时,参数也很好看。
问题是params中只发送了一个自定义字段的参数。如果有多个字段,则仅发送最后一个字段。
假设我有一个作者和电子邮件自定义字段,并在新的帖子表单中,我将名称设置为'John Doe'并发送电子邮件为'john@example.com',这是我在params中获得的(只有一个)自定义字段实例,电子邮件一,最后一个):
Parameters:
{..., "post"=>{"title"=>"post2", ...},
"custom_field_instances"=>
{"value"=>"john@example.com", "custom_field_id"=>[email_custom_field_id]},
"commit"=>"Create Post"}
这是我期望在params中看到的(两个自定义字段实例:
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
视图/帖/ 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 -->
我也试过没有@custom_field_instance
行fields_for
变为<%= fields_for :custom_field_instances do |custom_field_instance_fields| %>
的{{1}},但它没有改变任何东西(仍然是最后一个自定义字段实例是唯一一个在PARAMS)。
更新1 :我也尝试使用accepts_nested_attributes_for
,但视图没有显示自定义字段文本字段,因为看起来nested_attributes仅用于关联的现有实例模型。变化是:
对于上述代码,我将accepts_nested_attributes_for :custom_field_instances
添加到 item_instance.rb ,并在上面的视图代码中,将fields_for ...
替换为post_form.fields_for ...
答案 0 :(得分:1)
将其设为Array
未经测试。
<强> try1:强>
<%= custom_field_instance_fields.text_field, name: 'value[]' %>
或
<%= custom_field_instance_fields.text_field, 'value[]' %>
相同的隐藏领域。
try2:(为OP工作)
使用{:multiple => true}
<强> try3:强>
serialize :name, Array
在CustomFieldInstance
模型中