Reputation: 3281
i created a messaging model where a user can send a private message to another user. however im not sure how to go about notifying the user he/she got a new message. does anyone have a way to go about doing this? or if there was a simple solution?
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
i can tell the sender that a private message was sent, but im not sure how i can notify the receiver a new private message was created.
help would be appreciated. thanks = )
Upvotes: 3
Views: 2365
Reputation: 2803
First, you can improve your controller like this:
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
Then, in your models:
# 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
This Notification
model allows you to store a user's notifications for different "events". You can even store whether a notification has been read or not, or set an after_create
callback in order to send an email to the notified user.
The migration for this Notification
model would be:
# 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
You can read about the Rails associations options here.
Upvotes: 4
Reputation: 19983
There are any number of ways to notify the recipient. You could have a worker process that sends out email notifications, or include an "inbox" on your site that shows how many messages someone has waiting.
You could also show a "flash" message to the recipient. You would do this by for instance including on a base template some code to check if there are any unread messages that have not had a notification delivered yet; if there aren't, nothing happens, and if there are, then a notification is displayed and the fact that the notif was displayed is recorded so that it won't be displayed a second time.
Upvotes: 1