read
Previous post explains on mongoid document array field and rails form implementation
Below example shows rails form integration of array field of embedded mongoid document
Lets consider scenario that student
embeds one family
who has many assets
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>class Student
</div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'> include Mongoid::Document
</div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='4' class='code-highlight-row numbered'><div class='code-highlight-line'> field :name
</div></div><div data-line='5' class='code-highlight-row numbered'><div class='code-highlight-line'> field :phone
</div></div><div data-line='6' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='7' class='code-highlight-row numbered'><div class='code-highlight-line'> embeds_one :family
</div></div><div data-line='8' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='9' class='code-highlight-row numbered'><div class='code-highlight-line'> validates_associated :family
</div></div><div data-line='10' class='code-highlight-row numbered'><div class='code-highlight-line'> accepts_nested_attributes_for :family
</div></div><div data-line='11' class='code-highlight-row numbered'><div class='code-highlight-line'>end</div></div></pre></div>
more include Mongoid::Document
ASSETS = ['flat', 'car', 'business', 'bunglow', 'cash']
field :members, type: Integer
field :assets, type: Array
Brief controller code
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>class StudentsController < ApplicationController
</div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'> def new
</div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'> @student = Student.new
</div></div><div data-line='4' class='code-highlight-row numbered'><div class='code-highlight-line'> @student.family ||= @student.build_family
</div></div><div data-line='5' class='code-highlight-row numbered'><div class='code-highlight-line'> end
</div></div><div data-line='6' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='7' class='code-highlight-row numbered'><div class='code-highlight-line'> def create
</div></div><div data-line='8' class='code-highlight-row numbered'><div class='code-highlight-line'> @student = Student.new(params[:student])
</div></div><div data-line='9' class='code-highlight-row numbered'><div class='code-highlight-line'> @student.family.assets.reject!(&:blank?)
</div></div><div data-line='10' class='code-highlight-row numbered'><div class='code-highlight-line'> if @student.save
</div></div><div data-line='11' class='code-highlight-row numbered'><div class='code-highlight-line'> [...]
</div></div><div data-line='12' class='code-highlight-row numbered'><div class='code-highlight-line'> else
</div></div><div data-line='13' class='code-highlight-row numbered'><div class='code-highlight-line'> render :action => :new
</div></div><div data-line='14' class='code-highlight-row numbered'><div class='code-highlight-line'> end
</div></div><div data-line='15' class='code-highlight-row numbered'><div class='code-highlight-line'> end
</div></div><div data-line='16' class='code-highlight-row numbered'><div class='code-highlight-line'>end</div></div></pre></div>
view form will look like-
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>= form_for(@student) do |s|
</div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'> = s.text_field :name
</div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'> = s.text_field :phone
</div></div><div data-line='4' class='code-highlight-row numbered'><div class='code-highlight-line'> - s.fields_for :family do |f|
</div></div><div data-line='5' class='code-highlight-row numbered'><div class='code-highlight-line'> = f.text_field :members
</div></div><div data-line='6' class='code-highlight-row numbered'><div class='code-highlight-line'> = f.text_field :religion
</div></div><div data-line='7' class='code-highlight-row numbered'><div class='code-highlight-line'> - Family::ASSETS.each do |asset|
</div></div><div data-line='8' class='code-highlight-row numbered'><div class='code-highlight-line'> /Here f.object_name #=> student[family]
</div></div><div data-line='9' class='code-highlight-row numbered'><div class='code-highlight-line'> = f.check_box :assets, :name => "#{f.object_name}[assets][]", asset</div></div></pre></div>