首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用rails表单访问mongoid中的子集以编辑和创建新条目

使用rails表单访问mongoid中的子集以编辑和创建新条目
EN

Stack Overflow用户
提问于 2012-05-19 14:51:41
回答 1查看 488关注 0票数 1

我在rails3中使用mongodb和mongoid。我对这一切都是新手。我的模型如下所示。

代码语言:javascript
复制
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

我的控制器

代码语言:javascript
复制
 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  

我的表单

代码语言:javascript
复制
<%= 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 %>

我正在尝试建立一个表单,在那里,所有的细节都可以编辑。我无法访问californium的地址详细信息,因为它是californium集合的子集。我可以显示californium的所有细节,包括地址,但不能创建一个可编辑的表单。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-25 04:10:09

尝试为嵌入式模型使用表单助手"fields_for“,如下面的工作示例所示。希望这能有所帮助。

我花了一段时间来处理打字错误和不一致之处,所以如果你想在未来得到一个更快的答案,请让你的问题既准确又尽可能少。

代码语言:javascript
复制
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

代码语言:javascript
复制
<%= 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

代码语言:javascript
复制
  match 'california/:id' => 'california#edit', via: :get
  match 'california/:id' => 'california#update', via: :post

test/functional/california_controller_test.rb

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10663038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档