gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:10:26 24 4
gpt4 key购买 nike

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

我已经搜索了使用 fields_for 的解决方案,但它似乎更适合处理您拥有对象/模型数组的情况,而不是我拥有的情况,即字符串数组。

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

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

对于 Controller ,假设是典型的 Controller ,但在 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 %>

这一切都很好。有几件事我不喜欢。

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

有人对如何实现这一点有更好的建议吗?还是您认为这是正确的?

最佳答案

我同意你的担忧 -

  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%>

另一种干净的方法可能是让表单生成器定义 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

关于ruby-on-rails - 创建和更新 Mongoid 数组字段的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6339214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com