2010-11-21 6 views
2

私は非常に難しいレールの問題を抱えています。私はいくつかの助けを求めると思っていました。状況は次のようになります。Rails - current_user情報が必要なカスタム検証

私は自分のユーザーモデルに安静な認証を使用しています。今、ユーザは数値である 'gold'という名前のフィールドを持っています。 Scaffoldingを使って作成されたBookという別のモデルがあります。

私がしたいことは簡単ですが、私はそれを行う方法を見ることができません。私はいくつかの検証を追加したいと思います。もしユーザーの金が100ではないとすれば、(足場の標準のビューから)新しい本を作成することはできません。

問題は、私のモデルからこれを検証するためにcurrent_user情報が必要なことです。ユーザーIDを取得して金額を取得するためには、その必要があります。私はそれをする良い方法(もしあれば)を見つけることができません。

コントローラーからもう1つの考えがありました。

if not User.has_the_needed_gold(current_user, 100) 
    flash[:goldError] = 'You do not have the needed gold to create this book.' 
#end 


respond_to do |format| 
    if @book.save 
    flash[:notice] = 'Book was successfully created.' 
    format.html { redirect_to(@book) } 
    format.xml { render :xml => @book, :status => :created, :location => @book } 
    else 
    format.html { render :action => "new" } 
    format.xml { render :xml => @book.errors, :status => :unprocessable_entity } 
    end 
end 

さて、私は出力そのメッセージをすることができず、新しいの保存中止:ブロックは本当に私が(作成足場の内側に)私自身のエラーメッセージを挿入することはできません「@ book.saveであれば、」しかし、標準本も同様です。私はベースに自分のエラーを追加しようとしましたが、それは(私は推測して保存した後に)クリアされました。私は状況とかなり混乱しています。私は結果を出さずに2時間ほど探しています。

誰もがそれを助けることができる場合は、そうしてください、あなたは私のトラブルの多くを割くだろう:)

ありがとうを読み取るための!

+0

どのようにモデルを定義していますか?書籍はユーザーに属し、ユーザーは多数の書籍を所有していますか? – s84

+0

実際、それは私の場合とは逆になるはずです。ユーザーには本がありますが、書籍は多くのユーザーに属することができます。私はまだ定義を実際に追加していませんが。この質問は鐘を鳴らします。関係を介して情報にアクセスすることは、それを考えるにはあまりにも愚かであった:/私は見てみる – Spyros

答えて

2

Bookの仮想属性を定義し、current_userにアクセスできるコントローラで設定し、それをBook検証に組み込むことができます。

+0

それは解決策でした!右のスポット、多くのおかげで:) – Spyros

+1

これは良いアイデアのようには聞こえません。モデルとコントローラーのレイヤーを少し緊密に連結しているため、コントローラーで正しく機能するように変数が設定されています。 –

+0

ジョーシアン、私は実際にそれを行う他の方法を見ることができません。 – Spyros

2

検証時にユーザーを確認します。ユーザールックアップはActiveRecordによってキャッシュされている可能性が高いため、パフォーマンスヒットではありません。

class Book 

    validate :check_gold 

    def check_gold 
    user = User.find(self.user_id) 
    self.errors.add(:user_id => "#{user.name} doesn't have enough gold!") if user.nil? or (user.gold < 100) 
    end 
end 
+0

私は実際にuser_id(未定義のメソッド 'user_id ')にエラーがあると思います。どんなにハードにしようと、私はbook_modelにcurrent_userを取得できません。 – Spyros

+0

user_idがBookモデルで定義されていない場合は、私はあなたが思ったように、関連付けを使用していません。 "books"テーブルに "user_id"という名前のフィールドがありますか?ユーザーは本を所有することになっていますか? –

関連する問題