显示嵌套模型

时间:2011-08-11 04:00:52

标签: ruby-on-rails ruby-on-rails-3

我的嵌套模型表单现在正在运行,但我在视图中显示数据时遇到问题。如何以一对多关系显示嵌套模型数据?任何帮助将不胜感激。

这是我的表格和控制器:

<%= form_for @account do |f| %>

<%= f.label :account_type %><br />
<%= f.text_field :account_type %><br />

    <%= f.fields_for :organizations do |builder| %>
        <%= builder.label :name %><br />
        <%= builder.text_field :name %><br />
        <%= builder.label :website %><br />
        <%= builder.text_field :website %><br />

        <%= builder.fields_for :locations do |lb| %>
            <%= lb.label :phone %><br />
            <%= lb.text_field :phone %><br />
            <%= lb.label :toll_free_phone %><br />
            <%= lb.text_field :toll_free_phone %><br />
            <%= lb.label :fax %><br />
            <%= lb.text_field :fax %><br />

            <%= lb.fields_for :addresses do |ab| %>
                <%= ab.label :address1 %><br />
                <%= ab.text_field :address1 %><br />
                <%= ab.label :address2 %><br />
                <%= ab.text_field :address2 %><br />
                <%= ab.label :city %><br />
                <%= ab.text_field :city %><br />
                <%= ab.label :state %><br />
                <%= ab.text_field :state %><br />
                <%= ab.label :zip %><br />
                <%= ab.text_field :zip %><br />
            <% end %>
        <% end %>
    <% end %>

<%= f.submit "Add account" %>
<% end %>

class AccountsController < ApplicationController

def show
    @account = Account.find(params[:id])
    @organization = @account.organizations
end

def new
    @account = Account.new
    organization = @account.organizations.build
    location = organization.locations.build
    location.addresses.build

    @header = "Create account"
end

def create
    @account = Account.new(params[:account])
    if @account.save
        flash[:success] = "Account added successfully"
        render 'show'
    else
        render 'new'
    end
end
end

通常,当存在一对多关系时,如何在视图中引用嵌套模型数据?我是否需要使用某种类型的“where子句”来指定子类,如方法?

这是一个简单的例子show.html.erb,我试图显示我刚刚创建的组织的名称。它不起作用。

<h1><%= @organization.name %></h1>

使用上述表单创建帐户后,呈现'show'操作会导致此错误:

NoMethodError in Accounts#create

Showing C:/Documents and Settings/Corey Quillen/My     
Documents/rails_projects/shop_manager/app/views/accounts/show.html.erb where line #1     
raised:

undefined method `name' for nil:NilClass
Extracted source (around line #1):

1: <h1><%= @organization.name %></h1>
Rails.root: C:/Documents and Settings/Corey Quillen/My    
Documents/rails_projects/shop_manager

Application Trace | Framework Trace | Full Trace
app/views/accounts/show.html.erb:1:in    
`_app_views_accounts_show_html_erb__790921876_14235864__946051513'
app/controllers/accounts_controller.rb:21:in `create'
Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"y59rGAhS+kqfH3v3axhlYuxvBbBxIWXg0yucCFwfBq8=",
 "account"=>{"account_type"=>"dfdf",
 "organizations_attributes"=>{"0"=>{"name"=>"dfdf",
 "website"=>"dfdf",
 "locations_attributes"=>{"0"=>{"phone"=>"dfdf",
 "toll_free_phone"=>"dfd",
 "fax"=>"",
 "addresses_attributes"=>{"0"=>{"address1"=>"",
 "address2"=>"",
 "city"=>"",
 "state"=>"",
 "zip"=>""}}}}}}},
 "commit"=>"Add account"}

2 个答案:

答案 0 :(得分:0)

由于你的关系是一对多,你必须使用

@organization.first.name

它将显示第一个组织。

由于@organization是一个数组,你必须收集所有名称,然后显示。

答案 1 :(得分:0)

你在show动作中说@organization = @ account.organizations。 你期望@organization包含什么? 想一想。它将是一个阵列,而不是一个单一的组织,因此循环使用并获得每个组织的名称

实际上,我认为你没有想到你的关系通过一个帐户属于一个组织。您真的希望帐户与多个组织相关联吗?

更新 - 参考评论 这是完全可能的,但您需要确定业务逻辑是什么,以确定需要在此处显示哪个组织。 如果您能够准确地解释您的人际关系应该如何运作,那么向您展示如何应用您的逻辑应该不会太困难

更新 - 如何获得主要组织

这只是在帐户模型

上设置新关联的问题
has_one :primary_organization.
        :class_name => 'Organization',
        :conditions => ['primary = ?', true]

然后在你的节目动作中写下

@account.primary_organization.first #because anything use on a find other than the primary key will always return an array even if there is only one record.

您可能还想检查primary_organization是否为空? 考虑将has_one重构为类方法。根据您的需要,可能没有必要 在这里阅读更多http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html