2011-08-23 14 views
-1

私のレールアプリにはPodcastとTrackモデルがあります。ポッドキャストには多くのトラックがあり、トラックはポッドキャストに属しています。私たちは、mixcloudために私たちのオーディオファイルをアップロードRoR - 自己のコンテキストがメソッド内で変化したときに、「古い」自己オブジェクトを参照するにはどうすればいいですか

はここで退屈な背景情報です。彼らが主催するショーごとに、彼らは標準的なHTMLバージョンに加えてjson表現を提供します。私たちのアプリは、このjsonフィードを取得して解析し、返されたデータを使用して作成されるPodcastオブジェクトの属性を設定します。

また、フィードを使用して、このPodcastに属するすべてのトラックの名前を取得し、Podcastの作成中にこれらのトラックをデータベースに作成することもできます。

コード多かれ少なかれ作品が、それは設定に失敗した:podcast_idを新しいトラックのいずれかに:

before_validation :create_tracks 
def create_tracks 
    # get json feed for podcast which is hosted hosted on mixcloud.com 
    json = a_method_that_gets_and_parses_json(self.json_url) 

    json.sections.each do |section| 
    if section.section_type=="track" 
     # track.name IS being set, but podcast_id is NOT being set, it is always null 
     Track.create(:name=>section.track.name, :podcast_id=>self.id) 
    end 
    end    
end 

私は自己の文脈という問題が起因していることを実感 Track.createメソッド内で使用すると変更されます。これは、.eachループの外側にself.json_urlを返すときと同じように、Podcastを参照しなくなりました。

ここで自己を使用できない場合は、現在のポッドキャストのIDをTrack.createメソッドに渡すにはどうすればよいですか?私はメソッドの外側と内側に変数を設定しようとしましたが、ここでは何も動作しないようです。レコードについては、トラックが作成されていて、その名前が正しく設定されていて、設定できないpodcast_idだけです。

答えて

3

selfのコンテキストはここでは変更されません。あなたが持っているものと同じであることがまだPodcastのオブジェクトです。

問題は、オブジェクトが保存される前に発生するこのメソッドbefore_validationを呼び出すことで、オブジェクトにIDが与えられる前に発生することです。 before_validationではなく、after_createを呼び出すことをお勧めします。これは、オブジェクトのIDが割り当てられるためです。

+0

ありがとう、コードをafter_createメソッドに移動して問題を修正しました。 – stephenmurdoch

関連する問題