2012-02-07 15 views
6

私は見えない/未読のアイテムがユーザに表示される私のサイトに簡単な通知システムを実装したいと思います。ユーザーの受信トレイのStack Exchangeで使用されている質問と同様に、質問などの未読コメントが表示されます。通知のために何かがRailsで読み込まれたかどうかを確認する方法

this question私はこれをどうやって行うのか概要を知ることができました。私が混乱していることは、何かが読まれたかどうかを判断する方法です。 read_at列を追加することはできますが、実際にどのように入力すればよいですか?誰かが私にそれを感謝するいくつかの基本的な指導で私を助けることができたら!

UPDATE#1:私はcurrent_user.idに対してuser_id(項目を作成しているユーザーのID)を確認し、私のアイテム#showアクションに条件を追加する場合、どのような。

unless @item.user_id == current_user.id 
    @item.read_at = Time.now 
end 

UPDATE#2:以下のようなもの以下のコードを使用して、私はそのrecipient_idcurrent_user IDと一致した場合、メッセージのread_atを更新しようとしています。しかし、それは動作していません。

def show 
    @message = Message.find(params[:id]) 
    if @message.recipient_id == current_user.id 
    @message.read_at == Time.now 
    @message.save 
    end 
    respond_to do |format| 
    format.html # show.html.erb 
    format.xml { render :xml => @message } 
    end 
end 

FINAL UPDATE:@prasvinにおかげで、ここに私のソリューションです。オブジェクトにread_at列を追加しました。オブジェクトには、既存のrecipient_id列もあります。だから私のコントローラのshowアクションに、私は次のように置く:

def show 
    @message = Message.find(params[:id]) 
    if @message.recipient_id == current_user.id 
    @message.update_attributes(:read_at => Time.now) 
    end 
    respond_to do |format| 
    format.html # show.html.erb 
    format.xml { render :xml => @message } 
    end 
end 

その後、私のhelper.rbファイルに:

def new_messages 
    Message.where(:recipient_id => current_user.id, :read_at => nil).count 
end 

そして、私のレイアウトで:

<% if new_messages > 0 %><span class="notification"><%= new_messages %></span><% end %> 
+0

注釈として、IDを明示的に記述するのを避けることができると思います。 @ message.recipient_id == current_user'の場合、 '@ message.update_attributes(:read_at => Time.now)を実行します。あるいは、単にメッセージモデル 'belongs_to:recipient、:class_name =>" User "、:foreign_key =>" recipient_id "'を持っていれば '@ message.recipient'です。チェックをしてください - それが動作すれば、それはより見栄えが良いです。 – prasvin

+0

ありがとうございます。私は非常にこれに似た何かにこだわっていた。あなたの進捗状況と作業コードを表示するための多くの小道具=)私はフラッシュ通知を使用してこれをしようとしていた、あなたのnew_messagesヘルパーは=多く助けた) – Sasha

答えて

2

方法で充填についてread_atのshowアクションの列、つまり、showアクションにオブジェクトがあり、ページのreendering前にread_at属性を更新します。

+0

しかし、初めてオブジェクトが表示された後は、だから私がメッセージを作成すると、それが表示され、 'read_at'が私によって埋められます。右?それとも? – tvalent2

+0

ええ、それはもっと考えが必要ですね。通知が必要なオブジェクトのread_atをnilに更新する方法はありますか?したがって、作成直後に埋め込まれたread_atは問題にならないでしょう。その間に、より良い解決策を考えてください。 – prasvin

+0

read_at列とupdated_at列を比較する方が良いと思います。作成直後にオブジェクトを表示する場合は、read_atが埋められます。オブジェクトが更新されると、read_at列とupdated_at列に基づいて通知が送信されます。お役に立てれば。 – prasvin

関連する問題