2011-07-19 6 views
5

私は最近、記事などがあり、上にコメント/管理システムがあるアプリケーションを作っています。ユーザーがコメントを残したときに起こる3つの事のうちの1つがあります。Ruby on Rails/Devise:ユーザーがログインしているかどうかを調べる

最初は、登録ユーザーであり、Devise経由でログインしている場合、そのコメントにステータスが「2」とフラグが立てられ、すぐに公開されます。彼らが一致する電子メールアドレスで以前に承認されたコメントを持つ匿名ユーザーである場合、コメントは「1」のステータスを取得し、承認のために調整キューに入れられます。ユーザーがまったく新しいもので、電子メールがシステムにない場合、そのコメントは「0」のステータスを取得し、電子メールはその電子メールを承認するためのリンクをクリックするために受信ボックスに送信されます。この後、適切な通知/フラッシュメッセージが表示されます。

私はこのすべてがうまくいきましたが、コントローラーのほとんどすべてのロジックと変数定義を行い、作成アクションを非常に肥大化させました。ベストプラクティスと「太ったモデル、スキニーコントローラー」の習慣を学ぶために、私はCommentモデル、特にログインしているかどうかを判断できる部分に私ができるロジックを移そうとしています。だから、仮に、モデルでこのような何か...

attr_accessor :message 
before_create :poster_type 

def poster_type 
    if current_user 
    self.status = 2 
    self.message = 'Your comment has been posted.' 
    elsif Comment.find_by_mail(self.mail, :conditions => { :status => [1,2]}).present? 
    self.status = 1 
    self.message = 'Your comment has been sent for moderation.' 
    else 
    self.status = 0 
    self.message = 'This is a new email, please confirm...' 
    end 
end 

問題がある、あなたは明らかに、モデルに考案のCURRENT_USERメソッド(またはuser_signed_in ?,などのような他のもの)を使用することはできません。私がこれを調べたすべての答えは、現在のユーザーの値などにアクセスするモデルのビジネスではないことを助けにしています。

しかし、モデルにユーザーの情報を与える必要はありません他のすべてのスレッドが実行しようとしているのを見て)、私がモデル内のメソッドを必要とするのは、単にログインしているかどうかだけです。

さらに、モデルでcurrent_user(または他のユーザー検出メソッド)を使用できない場合は、コントローラ内のすべてのロジックを定義する以外の選択肢はありません。まあ?可能であれば、モデルでこのロジックをどのように行うことができますか?それとも単にコントローラーを脂肪のままにしておきますか?

答えて

7

レイヤーが分離されているため、任意のモデルからdeviseユーザまたはセッションにアクセスすることはできません。あなたができることは、オブジェクトをモデルに送信することです。

私は以前あなたのソリューションのようなことをしてきました。それは単なる頭痛でした。

あなたの作成アクションです。

def create 
    if current_user 
     @user.current_user(true) 
    end 
end 

それからちょうど、ユーザーのメソッドへの真/偽の送信:

def current_user(current_user) 
    current_user 
end 

を、あなたはそれが本当であるかどうかを確認するbefore_createを持つことができます。

+0

私はcustomers_controller.rbというコントローラとモデルcustomer.rbを持っています。どのようにしてのような条件チェックを実装できますか?user_signed_in? // signed_inがtrueの場合 //ここで自分の検証コード elsif!user_signed_in? // signed_inがfalseの場合 //ここに私の検証コード else //ここで私の検証コード end –

+0

私はそれと同様の問題を抱えています。 –

関連する問題