配列フィールドを持つMongoidモデルのフォームを作成するのに苦労してきました。配列のエントリごとにフォームにテキストボックスを配置したいと思います。新しいレコードを作成する場合、デフォルトは1つの空のフィールド(およびページに新しいフィールドを動的に追加するためのJavaScript)になります。
fields_forを使用して解決策を探しましたが、文字列の配列である私が持っている場合ではなく、オブジェクト/モデルの配列がある場合を処理することを目的としているようです。
人と電話番号の例を使用します。
class Person
include Mongoid::Document
field :name, :type => String
field :phone_numbers, :type => Array
end
コントローラーについては、一般的なコントローラーを想定していますが、このnew
方法では、phone_number配列を1つの空白の文字列で初期化しました。
フォームコードは次のとおりです。
<%= 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呼び出しのフィールドのハードコードされた名前。
- f.text_fieldの代わりにtext_field_tagを使用する
- どういうわけかこれの代わりにfields_forを使うべきだと感じている
誰かがこれを実装する方法についてもっと良い提案がありますか?それともこれは正しいと思いますか?