2012-04-23 8 views
3

私は、ユーザーがプライベートメッセージを別のユーザーに送信できるメッセージングモデルを作成しました。しかし、私は彼/彼女が新しいメッセージを持っていることをユーザーに通知する方法についてはわかりません。誰でもこれをやり遂げる方法がありますか?または単純な解決策がある場合は?ユーザーがプライベートメッセージを受信した通知を送信する方法

def create 
     @message = current_user.messages.build 
     @message.to_id = params[:message][:to_id] 
     @message.user_id = current_user.id 
     @message.content = params[:message][:content] 
     if @message.save 
      flash[:success ] = "Private Message Sent" 
     end 
     redirect_to user_path(params[:message][:to_id]) 
    end 

私はプライベートメッセージが送信されたことを送信者に伝えるが、私は新しいプライベートメッセージが作成された受信機に通知することができる方法イム確認することはできません。

助けていただければ幸いです。ありがとう=)

答えて

4

まず、あなたはこのようなあなたのコントローラーを向上させることができます

def create 
    @message = current_user.messages.new(params[:message]) 

    if @message.save 
    flash[:message] = "Private Message Sent" 
    end 
    redirect_to user_path(@message.to_id) 
end 

次に、あなたのモデルに:

# app/models/message.rb 
class Message < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :recipient, class_name: 'User', foreign_key: :to_id 
    has_many :notifications, as: :event 

    after_create :send_notification 

private 
    def send_notification(message) 
    message.notifications.create(user: message.recipient) 
    end 
end 

# app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :messages 
    has_many :messages_received, class_name: 'Message', foreign_key: :to_id 
    has_many :notifications 
end 

# app/models/notification.rb 
class Notification < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :event, polymorphic: true 
end 

このNotificationモデルでは、さまざまな「イベント」のために、ユーザの通知を保存することができます。通知が読み取られたかどうかを保存したり、通知されたユーザーに電子メールを送信するためにafter_createコールバックを設定することもできます。

このNotificationモデルの移行は、次のようになります。

# db/migrate/create_notifications.rb 
class CreateNotifications < ActiveRecord::Migration 
    def self.up 
    create_table :notifications do |t| 
     t.integer :user_id 
     t.string :event_type 
     t.string :event_id 
     t.boolean :read, default: false 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :notifications 
    end 
end 

あなたはRailsの関連付けオプションhereについて読むことができます。

+1

おかげさまでお世話になりました!私はこの前の笑を得たいと思う。私は自分のメッセージモデルのread_at属性を作成して、ユーザーがメッセージを表示するアクションに入ると、タイムスタンプを作成します。私のアプリケーションのヘルパーには、そこに何個の無限オブジェクトがあるか(未読を意味する)を見るメソッドがあります。私はあなたのコードについてもっと深く考えます。その興味深い=)前に多態性について聞いたことがない – Sasha

1

受信者に通知する方法はいくつでもあります。電子メール通知を送信するワーカープロセス、または待機中のメッセージの数を示す「受信トレイ」をサイトに含めることができます。

また、受信者に「フラッシュ」メッセージを表示することもできます。たとえば、通知がまだ届いていない未読メッセージがあるかどうかを確認するコードを基本テンプレートに含めるなどして、これを実行します。存在しない場合には何も起こらず、存在する場合には通知が表示され、notifが表示されたという事実は2度目には表示されないように記録される。

+0

ありがとう私は受信トレイのように未読の件数を出しました=) – Sasha

関連する問題