2012-01-17 6 views
2

before_saveメソッドが親の@userにアクセスできないことを除いて、オブジェクトのネストされたフォームで作業する際にかかわらず、サブモデル自体を保存するとき...それはしかし正常に動作します。..Rubyのレール3 before_saveメソッドがオブジェクトがnilである親モデルにアクセスするため、ネストされたフォームが保存されない

ので、ここでは簡略化されたコード

class Forum < ActiveRecord::Base 
    has_many :forum_post, :dependent => :destroy 
    belongs_to :project 
    accepts_nested_attributes_for :forum_post, :reject_if => :all_blank 
end 

class ForumPost < ActiveRecord::Base 
    belongs_to :forum  
    belongs_to :user 
    before_save :toggle_forum    
    has_attached_file :attachment 

def toggle_forum 
    #a bunch of code 
    #one line tries to access @user.id but it fails because @user is nil 
    @user.id 


    end 

end 

はその後、これを更新し、私のForumControlerコントローラに私が

を持っています
def update 
@forum = Forum.find(params[:id])  
if @forum.update_attributes(params[:forum])    
    redirect_to(user_forum_path(@user,@forum.project,@forum), :notice => 'Forum was successfully updated.') 
    else   
    render :action => 'submit'   
    end 

エンド

そして、私の意見で:

<%= form_for(@forum, :url => user_forum_path, :html => { :multipart => true, :id => :project }) do |f| %>  
    <div class="form-label-row summary-text"> 
     <%= f.label(:summary_text, 'Final Summary') %> 
     <%= f.text_area :summary_text %> 
    </div> 

    <%= f.fields_for :forum_post,$forum_post do |child_form| %> 
     <div class="form-row-left attachment"> 
      <%= child_form.label :attachment %> 
      <%= child_form.file_field :attachment %>  
     </div> 
     <!-- I tried adding with and without the next 2 hidden fields and it failed either way --> 
     <%= child_form.hidden_field :user_id, :value=>@user.id %>    
     <%= child_form.hidden_field :forum_id, :value=>@forum.id %> 
    <% end %> 

    <%= hidden_field(:forum, :state, :value => :student_completed) %> 
    <div class="form-buttons" id="submit"> 
     <%= f.submit "Submit Project" %> 
    </div> 
<% end %> 

問題は@userがnilの場合、ネストされたオブジェクトとしてforum_postを保存するときにということです..私は、独自のモデルでforum_postを保存する場合、それは動作します良い。 @user変数が親オブジェクトから保存するときに値が設定されない理由は何ですか?

+0

@userはどこに作成されましたか?あなたの更新作業のどこからも来ていないようです。 – bostonou

答えて

2

アソシエーションではなくインスタンス変数を使用してもよろしいですか?試してみてください:

def toggle_forum 
    #a bunch of code 
    #one line tries to access @user.id but it fails because @user is nil 
    user.id 
end 
+0

それは問題です。奇妙なのは@PopPostで直接作成されたオブジェクトを使って設定したときに@ user.idと一緒に働いていたからです。これらはまったく異なるクラスにあったので、Rubyのクラス変数のスコープが何であるか疑問に思います。別の場所に設定されました。 –

+0

ありがとうございます。私は、before_createコールバック中にchildの派生した値のためにself.parentにアクセスしようとしているときに同様の問題に悩まされました。親にアクセスすると、スコープの問題が直接解決されました。 – Dan

関連する問題