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

2 回答 2

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 关联选项的信息。

于 2012-04-23T23:31:06.727 回答
1

有多种方法可以通知收件人。您可以有一个发送电子邮件通知的工作进程,或者在您的站点上包含一个“收件箱”,以显示有人在等待多少消息。

您还可以向收件人显示“闪光”消息。例如,您可以通过在基本模板中包含一些代码来检查是否有任何尚未发送通知的未读消息;如果没有,则不会发生任何事情,如果有,则会显示通知,并记录显示通知的事实,以便不会再次显示。

于 2012-04-23T22:59:23.513 回答