如何将用户定义的自定义字段添加到模型中?

时间:2014-11-29 06:48:42

标签: ruby-on-rails forms form-helpers fields-for

在我的博客应用程序中,我有一个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_instancefields_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 ...

1 个答案:

答案 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模型中