用于创建和更新Mongoid数组字段的表单

Dav*_*sen 13 ruby ruby-on-rails mongodb fields-for mongoid

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

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

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

class Person
  include Mongoid::Document
  field :name, :type => String
  field :phone_numbers, :type => Array
end
Run Code Online (Sandbox Code Playgroud)

对于控制器,只假设典型的控制器,但在new方法中我用一个空字符串初始化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 %>
Run Code Online (Sandbox Code Playgroud)

一切正常.有一些我不喜欢的事情.

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

有没有人对如何实现这个有更好的建议?或者你认为这是正确的吗?

San*_*ing 8

我同意你的担忧 -

  1. text_field_tag呼叫中字段的硬编码名称.

  2. 使用text_field_tag而不是 f.text_field

  3. 运用 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%>
Run Code Online (Sandbox Code Playgroud)

另一个干净的方法可能是使用表单构建器定义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 %>
Run Code Online (Sandbox Code Playgroud)

您可以在这里找到更多信息