2010-11-23 5 views
1

私のRuby on Railsアプリケーションでは、プロファイル用に新しいプロファイルと新しい統計を作成したいと思います。まず、ユーザーモデルから関連するメソッドを呼び出し、次にプロファイルモデルから呼び出します。私はこれを持って私のプロファイルモデル(profiles.rb)に他のコントローラに関連するモデルからメソッドを正しく呼び出す方法は?

... 

has_one :profile 

... 
before_save :inizialize_user 
... 

private 

def inizialize_user 
    @user_profile = Profile.new 
    self.user_profile_id = @user_profile.id 
end 

...:

そう...

を...私のユーザモデル(user.rb)に私はこれを持っています 「検査」@profile_statistic結果、新しいオブジェクト(!正しい)

012:「before_save」が新しいプロファイル統計をインスタンス上のコードの第2のブロックにおいて

... 
belongs_to :user 
... 

before_save :inizialize_profile 

private 

def inizialize_profile 
    @profile_statistic = ProfileStatistic.new 
end 

、 @user_profile結果はnil(!それが新しいプロファイルオブジェクトでなければなりません)

最後の部分を「検査」 :それは新しいプロファイルをインスタンス化しません「before_save」上のコードの最初のブロックで

、私の問題です。それはなぜ起こるのですか?

答えて

3

Profile.newを呼び出すと、インスタンスはメモリにのみ作成され、データベースには保存されないため、id属性(つまり、@ user_profile.idはnil)はありません。

私は、インスタンスを保存し、その後user_profile.id @ゼロではありません

@user_profile = Profile.create 

create

@user_profile = Profile.new 

を交換示唆しています。

before_createコールバック(before_saveではなく)を使用しないでください。モデルを保存するたびに(たとえば、udpating後に)新しいユーザープロファイルが作成されます。また、あなたはおそらく「ProfileStatistic.create」は動作しない理由を私は理解していない

ProfileStatistic.create 

代わりの

ProfileStatistic.new 
+0

持つようにしたい:新しいプロファイルオブジェクトを作成しないようです。 – user502052

+0

ProfileStatistic.createはレコードをデータベースに保存します。したがって、検証に失敗すると動作しません。たとえば、 "validates_presence_of:name"がある場合は、このProfileStatistic.create(:name => '希望する名前')のように作成できます。すべての検証が成功したプロファイル統計を作成してください。コンソールで "p = ProfileStatistic.create"でテストできます。コンソールが「偽」を返す場合は、「p.errors」を使用する理由を参照してください。 –

関連する問題