【问题标题】:How do I add user defined custom fields to a model?如何将用户定义的自定义字段添加到模型?
【发布时间】: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 行变为&lt;%= fields_for :custom_field_instances do |custom_field_instance_fields| %&gt;,但它不会改变任何东西(最后一个自定义字段实例仍然是参数中唯一发送的实例)。

更新 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


    【解决方案1】:

    将其设为Array

    未测试。

    try1:

    <%= custom_field_instance_fields.text_field, name: 'value[]' %>
    

    <%= custom_field_instance_fields.text_field, 'value[]' %>
    

    隐藏字段也一样。


    try2:(为OP工作)

    使用{:multiple =&gt; true}


    try3:

    serialize :name, Array
    

    在您的 CustomFieldInstance 模型中

    【讨论】:

    • 谢谢! try2 - multiple: true 工作! try1 - 两个选项都不起作用,没有尝试 try3。您能否更新答案以反映 try2 有效,谢谢。
    • 它适用于新的,但在编辑中,字段不会被预填充。我是否应该有单独的新代码和编辑代码(在编辑情况下,我可以代替上述代码,而不是上面的代码,@post.custom_field_instances.each do ...
    • 你可能有不同的看法,使用value字段。
    • 似乎早期版本的浏览器不支持 multiple 属性 - 是否有更多的 rails-y 方法可以在旧版浏览器中工作?
    • in rails multiple 做了 2 件事,将 name 属性设置为 Array 并将 multiple 添加到所选标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2014-04-02
    相关资源
    最近更新 更多