Access subcollection in mongoid with rails form to

2019-06-02 19:51发布

问题:

I am using mongodb with mongoid in rails3. I am newbie to all this. My models are as shown below.

class Californium
 include Mongoid::Document 
 field :first_name 
 field :License_type
 Field :Licese_expiry_date
embeds_one :address 
end

class Address 
 include Mongoid::Document 
 field :street 
 field :city 
 field :state 
 field :zip 
embedded_in :Californium, :inverse_of => :address 
end

My Controller

 class CaliforniaController < ApplicationController

   def index
    @california = Californium.all
    respond_to do |format|
    format.html # index.html.erb
    format.xml  { render :xml => @california }
    end
   end

   def show
    @californium = Californium.find(params[:id])  
     respond_to do |format|
     format.html # show.html.erb
     format.xml  { render :xml => @californium }
     end
   end

  # Here is where I have problem. I am not able to show a 
  # form with californium address details. My form view is show after the controller

   def new        
     @californium = Californium.new
     respond_to do |format|
     format.html # new.html.erb
     format.xml  { render :xml => @californium }
     end
   end

    def edit
     @californium = Californium.find(params[:id])
    end

 end  

My form

<%= form_for(@californium) do |f| %>

<div class="field">
<%= f.label :license_number %><br />
<%= f.text_field :license_number %>
</div>

<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :license_type %><br />
<%= f.text_field :license_type %>
</div>
<div class="field">
<%= f.label :license_status %><br />
<%= f.text_field :license_status %>
</div>
<div class="field">
<%= f.label :license_expire_date %><br />
<%= f.text_field :license_expire_date %>
</div>
<div class="field">
<%= f.label :license_issue_date %><br />
<%= f.text_field :license_issue_date %>
</div>

<div class="field">

 # Here I am not able to access :address.street and :address.city as it is an other 
 # model embedded in californium

<%= f.label :address.street %><br />
<%= f.text_field :address.street %>
</div>

<div class="field">
<%= f.label :address.city %><br />
<%= f.text_field :address.city %>
</div>

<div class="actions">
<%= f.submit %>
</div>
<% end %>

I am trying to build a form where in all the details of the californium could be edited. I am not able to access californium's address details as it is a subcollection of californium collection. I am able to display all the details of the californium including the address but dont how to create a editable form.

回答1:

Try using the form helper "fields_for" for your embedded model as in the following working example. Hope that this helps.

It took a while to wade through the typos and inconsistencies, so if you want a faster answer in the future, please make your question both as accurate and as minimal as possible.

class Californium
  include Mongoid::Document
  field :name
  field :license_type
  embeds_one :address
end

class Address
  include Mongoid::Document
  field :street
  field :city
  field :state
  field :zip
  embedded_in :california, :inverse_of => :address
end

app/views/edit.html.erb

<%= form_for :californium do |f| %>

    <div class="field">
      <%= f.label :name %>
      <br/>
      <%= f.text_field :name %>
    </div>
    <div class="field">
      <%= f.label :license_type %>
      <br/>
      <%= f.text_field :license_type %>
    </div>

    <%= fields_for @californium.address do |af| %>
        <div class="field">
          <%= af.label :street %>
          <br/>
          <%= af.text_field :street %>
        </div>

        <div class="field">
          <%= af.label :city %>
          <br/>
          <%= af.text_field :city %>
        </div>
    <% end %>

    <div class="actions">
      <%= f.submit %>
    </div>

<% end %>

config/routes.rb

  match 'california/:id' => 'california#edit', via: :get
  match 'california/:id' => 'california#update', via: :post

test/functional/california_controller_test.rb

require 'test_helper'

class CaliforniaControllerTest < ActionController::TestCase
  def setup
    Californium.delete_all
  end

  test "form" do
    cal = Californium.create(name: 'Benjamin Spock', license_type: 'MD', address: Address.new(street: '311 Temple St', city: 'New Haven', state: 'CT', zip: '06511'))
    assert_equal(1, Californium.count)
    p Californium.find(cal.id)
    get :edit, id: cal.id
    assert(assigns(:californium))
    assert_response(:success)
    puts @response.body
  end
end