2011-08-11 10 views
0

ネストされたモデルフォームが機能していますが、ビューにデータを表示する際に問題があります。 1対多の関係でネストされたモデルデータを表示するにはどうすればよいですか?どんな助けでも大歓迎です。ここでネストされたモデルを表示する

は私のフォームとコントローラです:1対多の関係が存在するとき、一般的に

<%= 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句"の型を持つ子を指定する必要がありますか?

ここでは、作成したばかりのOrganizationの名前を表示しようとしている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"} 
+1

あなたのショーアクションのコントローラコードも投稿できますか? – Msencenb

+0

あなたは 'redirect_to ... 'ではなく、あなたの作成アクションで' render show'をやっているでしょう。ですから、コントローラコードを教えてください。 – Mischa

答えて

0

あなたはshowアクションで@organization = @ account.organizationsと言っています。 @organizationには何が含まれていますか? それについて考えてみてください。単一の組織ではない配列になるので、それをループして各組織の名前を取得してください。

実際には、あなたの組織が組織に属しているかどうかは確かにあなたの関係は確かではないと思います。あなたは本当にアカウントを複数の組織に関連させたいのですか?

UPDATE - 行うことが完全に可能ですが、あなたは、ビジネスロジックは、それがここに表示される必要がある組織の決定が何であるかを決定する必要があり 以下の文献のコメント。あなたがあなたの関係は、どのようにあなたのロジック

更新プログラムを適用するにはお見せするにはあまりにも難しいことではありません動作するようになっているかを正確に説明することができた場合 - 主要組織

を取得するにはどのようにこれは単純ですあなたのshowアクションに

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

+0

私はアカウントと組織の間に一対一の関係を保ちたいと思います。特定のアカウントをデータベース属性で指定する方法はありますか? –

+0

私は、組織テーブルに 'primary'論理列を持っています。アカウントごとに1つの組織だけが「true」とマークされます。 @ account.organizationsの呼び出しでどのように指定するのですか?私はそれにチェーンできる方法はありますか?ありがとう。 –

+0

大丈夫です。それは私が探しているもののように聞こえる。あなたのすべての協力に感謝します。 –

0

あなたの関係は1対多であるとして、あなたは

を使用する必要があります
@organization.first.name 

最初の組織が表示されます。

@organizationは配列なので、すべての名前を集めて表示する必要があります。

+0

これは機能しますが、最初の組織以外の組織を指定したい場合はどうすればよいですか? –

関連する問題