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



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

相关内容

  • 没有找到相关文章

最新更新