ruby-on-rails – 用于创建和更新Mongoid数组字段的表单

我一直在努力为具有数组字段的Mongoid模型创建一个表单.我希望我的表单在数组中的每个条目都有一个文本框.如果我正在创建一个新的记录,认将是一个空的字段(和一些 JavaScript页面上动态添加新的字段).

我已经搜索了一些使用fields_for的解决方案,但是似乎更有意义的是处理一个具有对象/模型数组的情况,而不是我拥有的,这是一个字符串数组.

我将使用一个人和一个电话号码的例子.

class Person
  include Mongoid::Document
  field :name,:type => String
  field :phone_numbers,:type => Array
end

对于控制器,只是假设典型的控制器,但是在新方法中,我用一个空白字符串初始化了phone_number数组.

这是表单代码

<%= form_for(@person) do |f| %>
    <div class="field">
      <%= f.label :name %><br />
      <%= f.text_field :name %>
    </div>
    <div class="field">
      <%= f.label :phone_numbers %><br />
      <% @person.phone_numbers.each do |phone_number| %>
        <%= text_field_tag "person[phone_numbers][]",phone_number %>
      <% end %>
    </div>
  <% end %>

这一切都很好.有一些我不喜欢的东西.

> text_field_tag调用中字段的硬编码名称.
>使用text_field_tag而不是f.text_field
有感觉就像我应该用某种方式使用fields_for而不是这个

有没有人有什么更好的建议如何实现这一点?或者你会认为这是正确的吗?

解决方法

我同意你的关切 –

> text_field_tag调用中的字段的硬编码名称.
>使用text_field_tag而不是f.text_field
>使用fields_for

做了一些研究后,发现前两个问题可以解决,也许第三个可以但还没有尝试.

<%= form_for(@person) do |f| %>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :phone_numbers %><br />
    <% @person.phone_numbers.each do |phone_number| %>
      <%= f.text_field :phone_numbers,:name => "#{f.object_name}[phone_numbers][]"%>
    <% end %>
  </div>
<%end%>

另一种干净的方法可能是使用表单构建器定义的text_field,然后具有 –

def text_field(attribute,*args)
  args.last.merge!(:name => "#{object_name}[#{attribute}][]") if args.last && args.last.is_a?(Hash) && args.last.delete(:array)
  super(attribute,args)
end

<% @person.phone_numbers.each do |phone_number| %>
  <%= f.text_field :phone_numbers,:array => true%>
<% end %>

You can find more information here

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...