【发布时间】:2014-11-29 06:48:42
【问题描述】:
在我的博客应用程序中,我有一个 post 模型 (name:string, body:text)。我想让用户定义一个custom_field(模型有名称:字符串)。这会导致post 表单包含该custom_field 的文本字段,并且该字段的值应作为创建或更新的参数返回。返回的实际数据是模型 custom_field_instance (value:string custom_field:references post:references)
例如,如果用户创建了一个名为 author 的自定义字段,以及另一个名为 email 的自定义字段,那么我希望帖子表单显示作者和电子邮件文本字段,以及与参数一起返回的两个自定义字段实例(一个用于作者,一个用于电子邮件)。
自定义字段在表单中显示良好,没问题。当有一个自定义字段时,参数看起来也很好。
问题是在参数中只发送了一个自定义字段的参数。如果有多个字段,则只发送最后一个的数据。
假设我有一个作者和电子邮件自定义字段,在新的帖子表单中,我将名称设置为“John Doe”,电子邮件设置为“john@example.com”,这是我在参数中得到的(只有一个自定义字段实例,email 一个,也就是最后一个):
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 -->
我也尝试过不使用@custom_field_instance,其中fields_for 行变为<%= fields_for :custom_field_instances do |custom_field_instance_fields| %>,但它不会改变任何东西(最后一个自定义字段实例仍然是参数中唯一发送的实例)。
更新 1:我也尝试使用 accepts_nested_attributes_for,但随后视图没有显示自定义字段文本字段,因为似乎nested_attributes 仅用于关联模型的现有实例。变化是:
在上面的代码中,我在item_instance.rb中添加了accepts_nested_attributes_for :custom_field_instances,并在上面的视图代码中,将fields_for ...替换为post_form.fields_for ...
【问题讨论】:
标签: ruby-on-rails forms form-helpers fields-for