2011-02-10 9 views
1

データを保存する前に外部キーを関連付けることができません(ネットワークモデルのフィールド 'user_id'はデータベースに保存されると空白になります)。私は「複数のモデルをフォームに関連付ける

class UsersController < ApplicationController 
def new 
    @user = User.new 
    @network = @user.build_network 
    @title = "Sign Up" 
end 

def create 
    @user = User.new(params[:user]) 
    if (@user.save) 
    @network = Network.new(params[:network]) 
    if (@network.save) 
     sign_in @user 
     flash[:success] = "Welcome!" 
     redirect_to @user 
    else 
     @title = "Sign up" 
     render 'new' 
    end 
    else 
    @title = "Sign up" 
    render 'new' 
    end 
end 

class Network < ActiveRecord::Base 
    belongs_to :user 
end 


class User < ActiveRecord::Base 
has_one :network, :foreign_key => "user_id", 
        :dependent => :destroy 

コントローラ:私は私のコードは、ずさんな:-)であればとても恐縮してください

モデルRoRのに新たなんです(form_forとfields_forを使用して)問題なしでビューからすべてのユーザー入力を得ることができます。 @ user.build_networkを使用することに加えて、has_one関連付けを明示的に定義する必要がありますか? accepts_nested_attributes_forを使用しての提案パー

、私は、ユーザーモデルで

def new 
    @user = User.new 
    @user.build_network 
    @title = "Sign Up" 
end 

def create 
    @user = User.new(params[:user]) 
    if (@user.save) 
    sign_in @user 
    flash[:success] = "Welcome!" 
    redirect_to @user   
    else 
    @title = "Sign up" 
    render 'new' 
    end 
end 

更新関連する私のコントローラをクリーンアップ:私が提出したときしかし、network_attributesはすべて空白になってい

has_one :network, :class_name => 'Network', 
     :foreign_key => "user_id", 
     :dependent => :destroy 

accepts_nested_attributes_for :network, 
           :reject_if => :all_blank, 
           :allow_destroy => true 

フォーム。私はhttp://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes(および多く)

私は私が使用して属性にアクセスすることができるよので、ビュー/フォームの問題だとは思わないだけでなく、提供されたリンクの指示に従っているNetwork.new(params[:network]

どんな考え/提案ですか?

答えて

3

これはhttp://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.htmlなどhttp://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_forを見ては、あなたが簡単に使用してそれを実装する方法を参照してくださいする必要がありaccepts_nested_attributes_for

を使用するための完璧な状況ですform_for


(ポスト質問更新)

Networkparams[:network]の属性にアクセスできる場合は、(残念ながら!)より微妙なものの1つが欠落していますfields_for

の呼び出しで、ネストされた属性の部分、私はあなたが(速度のためHAML構文を使用して)次の線に沿って何かを持っていると仮定しています:

= form_for @user do |f| 
    = f.text_field :name 
    = f.text_field :email_address 

    - fields_for @network do |n| 
    = n.text_field :name 

これに伴う問題は、そのRailsのですあなたのUserNetworkフィールドの間のフォームに明示的な接続が表示されていません。(それはスマートだが、ないスマートこと)

の方法は、あなたが明示的にNetworkは、ネストされた属性を更新するために(User内にネストされていることを述べることは、あなたがUserフォームビルダでfields_for @network関数を呼び出すことを確認することです、それ自体によって:あなたのフォームを送信してparamsを検査する際

= form_for @user do |f| 
    = f.text_field :name 
    = f.text_field :email_address 

    - f.fields_for @network do |n| 
    = n.text_field :name 

そうすれば、あなたが持っていることに気づくでしょう両方params[:user]params[:user][:network] - Railsはネストされたattributtesを認識しますとなり、それらを保存してリンクしてください。

+0

チップをありがとう。ネットワーク属性の保存に関する問題がまだ残っているので、質問を更新しました。 –

+0

心配しないで、変更を反映するために私の答えを更新しました。 –

2

それはあなたがこのように、Userモデルの他の属性と一緒に、attr_accessibleなどのネットワークを設定する必要が可能です:

attr_accessible :name, :age, :network_attributes, ...

はあなたにもすべては、あなたがしたい属性を配置する必要がありますのでご注意ください「マス上記の例では、nameと:ageのようにリストに 'assign'を指定します。

関連する問題