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
在做了一些研究后发现,前两个问题可以解决,可能还有第三个可以但尚未尝试过.
<%= 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)
归档时间: |
|
查看次数: |
9680 次 |
最近记录: |