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

Ruby on rails 如何将用户定义的自定义字段添加到模型中?,ruby-on-rails,forms,form-helpers,fields-for,Ruby On Rails,Forms,Form Helpers,Fields For,在我的博客应用程序中,我有一个post模型(name:string,body:text)。我想允许用户定义一个自定义_字段(模型名为:string)。这会导致post表单包含该自定义字段的文本字段,该字段的值应作为参数从create或update返回。返回的实际数据是模型自定义字段实例(值:字符串自定义字段:引用post:references) 例如,如果用户创建了一个名为author的自定义字段,以及另一个名为email的自定义字段,那么我希望post表单显示一个author和email文本字

在我的博客应用程序中,我有一个
post
模型(
name:string,body:text
)。我想允许用户定义一个
自定义_字段
(模型名为:string)。这会导致
post
表单包含该
自定义字段的文本字段,该字段的值应作为参数从create或update返回。返回的实际数据是模型自定义字段实例(值:字符串自定义字段:引用post:references)

例如,如果用户创建了一个名为author的自定义字段,以及另一个名为email的自定义字段,那么我希望post表单显示一个author和email文本字段,并返回两个自定义字段实例和参数(一个用于author,一个用于email)

自定义字段在表单中显示良好,没有问题。当只有一个自定义字段时,参数看起来也很好

问题是参数中只发送了一个自定义字段的参数。如果有多个字段,则只发送最后一个字段的数据

假设我有一个author和email自定义字段,在新的post表单中,我将name设置为“johndoe”,email设置为“johndoe”john@example.com,以下是我在参数中得到的信息(只有一个自定义字段实例,电子邮件实例,它是最后一个):

以下是我希望在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\u controller.rb:

def new
  @post = Post.new
  @custom_fields = CustomField.all
end
<%= 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.text_field, name: 'value[]' %>
serialize :name, Array
views/posts/new.html.erb:

def new
  @post = Post.new
  @custom_fields = CustomField.all
end
<%= 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.text_field, name: 'value[]' %>
serialize :name, Array

...
...
我也尝试过不使用
@custom\u field\u实例
,其中
行的
fields\u变为
,但它没有改变任何东西(仍然最后一个自定义字段实例是在参数中发送的唯一实例)

更新1:我还尝试使用
接受嵌套的属性,但是视图没有显示自定义字段文本字段,因为嵌套的属性似乎只用于关联模型的现有实例。更改如下:


在上面的代码中,我为自定义字段实例添加了
accepts\u nested\u attributes\u,用于item\u instance.rb,并在上面的视图代码中,将
字段替换为
post\u form.fields\u for…
作为
数组

没有测试

try1:

def new
  @post = Post.new
  @custom_fields = CustomField.all
end
<%= 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.text_field, name: 'value[]' %>
serialize :name, Array

在您的
CustomFieldInstance
model

中,谢谢!try2-
多个:true
有效!try1-两个选项都不起作用,没有尝试try3。请更新答案以反映try2有效,谢谢。它适用于new,但在edit中,字段不会被预填充。我是否应该为new和edit使用单独的代码(在编辑案例中,我可以不使用上面的方法,而是使用
@post.custom_field_实例。每个do…
ya可能是不同的视图,使用
value
field。似乎早期版本的浏览器不支持多属性-是否有更多的rails-y方法可以在较旧的浏览器中工作?在
rails
multiple中执行两项操作,将name属性设置为
Array
,并将
multiple
添加到所选标记中。