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
class Family
include Mongoid::Document
ASSETS = ['flat', 'car', 'business', 'bunglow', 'cash']
field :members, type: Integer
field :assets, type: Array
field :religon
embedded_in :student
end

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>

Blog Logo

Sandip Ransing


Published

Image

Fun On Rails

Journal of a Web Developer #ruby #rails #JS

Back to Overview