2012-05-02 17 views
0

モデルの属性を初期化するとすぐに設定しようとしています。私はbefore_initialise、after_initialise、before_create、after_createを試しました。Rails:初期化時にmodel's属性を設定する方法

私は間違っていますか?

describe "turn based system" do 
    before(:each) do 
    @user1 = Factory :user 
    @user2 = Factory :user 

    @rota = @user1.rotas.create 
    @rota.users << @user2 
    end 

it "should be user1's turn at the beginning" do 
    @rota.current_turn.should == @user1.id --> fails 
end 

実装:

class Rota < ActiveRecord::Base 
    has_many :rotazations 
    has_many :users, :through => :rotazations 
    has_many :invitations 

    after_create :set_current_turn 

    private 

    def set_current_turn 
    if self.users.count > 0 
     self.current_turn = self.users[0].id 
    end 
    end 
end 

EDIT 私が使用してロタのモデルを構築した場合:

@rota = @user1.rotas.create(:current_turn => @user1.id) 

が、それは動作します - しかし、私はコードを複製イムように感じる - 私はいつもしたいですcurrent_turnフィールドはオブジェクト作成者のIDになります。

ありがとうございます!

+0

確かにself.users.count> 0ですか? – c0deNinja

+0

私はかなりわかりません - 効果的に@ user1.rotas.create - その特定のロータについては、ユーザー数は1(多対多の関係から)でなければなりません。ただし、set_current_turnが呼び出されたときに1ではない可能性があります。どのようにコードを変更して、ロータを作成するユーザーのIDがcurrent_turn – Karan

答えて

0

あなたがタイプミスを持っている:before_filterbefore_filterafter_createにを変更するには、コントローラのコールバック関数です。

2)after_createを使用して、ユーザーが既に関連付けられているため、関連付けを使用することができます。

+0

に設定されているのかを試してみました。残念ながら、それは動作しませんでした。私はそのオブジェクトは初期化されているので(rotaインスタンス)誰がそれを作成したのか分からないので(@ user1インスタンス)メソッドは呼び出されますが、その特定の点でrota.users = []を実行します。 – Karan

+0

OK、 'after_create'を実行し、属性を設定して直後に保存します。その後、ユーザーは関連付ける必要があります。 (更新された答え) – ctcherry

+0

ええ、それも試しました - ユーザーフィールドはまだ空のafter_createを空にします。 after_create LOLの後には何が来ますか? – Karan

関連する問題