Ruby on rails 向RoR邮件收件箱系统添加通知

Ruby on rails 向RoR邮件收件箱系统添加通知,ruby-on-rails,ruby,notifications,messaging,inbox,Ruby On Rails,Ruby,Notifications,Messaging,Inbox,我有一个带有实习生信息系统的rails应用程序。用户可以向其他用户发送消息。示例:用户1发送消息用户2可以响应viceversa 一切都很完美。但我想用Notifications功能升级这个系统。我想更改通知的类型: 1) 在导航栏上 2) 邮寄 问题:我不知道如何才能做到这一点 你能帮我吗 对话表 class CreateConversations < ActiveRecord::Migration def change create_table :conversations do

我有一个带有实习生信息系统的rails应用程序。用户可以向其他用户发送消息。示例:用户1发送消息用户2可以响应viceversa

一切都很完美。但我想用Notifications功能升级这个系统。我想更改通知的类型:

1) 在导航栏上 2) 邮寄

问题:我不知道如何才能做到这一点

你能帮我吗

对话表

class CreateConversations < ActiveRecord::Migration
 def change
  create_table :conversations do |t|
   t.integer :sender_id
   t.integer :recipient_id
   t.timestamps
  end
 end
end
class CreateConversations
消息表。在这段代码中,我有一个布尔值:read。我认为解决办法就在这里。你觉得这个怎么样

class CreateMessages < ActiveRecord::Migration
 def change
  create_table :messages do |t|
   t.text :body
   t.references :conversation, index: true
   t.references :user, index: true
   t.boolean :read, :default => false
   t.timestamps
  end
 end
end
class CreateMessagesfalse
t、 时间戳
结束
结束
结束
会话.rb

class Conversation < ActiveRecord::Base
 belongs_to :sender, :foreign_key => :sender_id, class_name: 'User'
 belongs_to :recipient, :foreign_key => :recipient_id, class_name: 'User'
has_many :messages, dependent: :destroy
validates_uniqueness_of :sender_id, :scope => :recipient_id
scope :between, -> (sender_id,recipient_id) do
 where("(conversations.sender_id = ? AND conversations.recipient_id =?) OR (conversations.sender_id = ? AND conversations.recipient_id =?)", sender_id,recipient_id, recipient_id, sender_id)
 end
end
类对话:sender\u id,class\u name:'User'
属于:收件人,:外键=>:收件人id,类别名称:'User'
有很多:消息,依赖::销毁
验证以下项的唯一性:发送方\u id,:范围=>:接收方\u id
范围:介于,->(发送方id、接收方id)之间
其中(“(conversations.sender\u id=?和conversations.recipient\u id=?)或(conversations.sender\u id=?和conversations.recipient\u id=?)”,发件人\u id,收件人\u id,收件人\u id,发件人\u id)
结束
结束
Message.rb

class Message < ActiveRecord::Base
 belongs_to :conversation
 belongs_to :user
 validates_presence_of :body, :conversation_id, :user_id
 def message_time
  created_at.strftime("%m/%d/%y at %l:%M %p")
 end
end
class消息
会话\u controller.rb

class ConversationsController < ApplicationController
  before_action :authenticate_user!

  # GET /conversations
  # GET /conversations.json
  def index
    @users = User.all

    # Restrict to conversations with at least one message and sort by last updated
    @conversations = Conversation.joins(:messages).uniq.order('updated_at DESC')
  end

  # POST /conversations
  # POST /conversations.json
  def create
  if Conversation.between(params[:conversation][:sender_id], params[:conversation][:recipient_id]).present?
    @conversation = Conversation.between(params[:conversation][:sender_id], params[:conversation][:recipient_id]).first
  else
    @conversation = Conversation.create!(conversation_params)
  end

  redirect_to conversation_messages_path(@conversation)
end

  private
    # Use callbacks to share common setup or constraints between actions.
    def conversation_params
      params.require(:conversation).permit(:sender_id, :recipient_id)
    end
end
class MessagesController < ApplicationController
  before_action do
   @conversation = Conversation.find(params[:conversation_id])
  end
def index
 @messages = @conversation.messages
  if @messages.length > 10
   @over_ten = true
   @messages = @messages[-10..-1]
  end
  if params[:m]
   @over_ten = false
   @messages = @conversation.messages
  end
 if @messages.last
  if @messages.last.user_id != current_user.id
   @messages.last.read = true;
  end
 end
@message = @conversation.messages.new
 end
def new
 @message = @conversation.messages.new
end
def create
 @message = @conversation.messages.new(message_params)
 if @message.save
  redirect_to conversation_messages_path(@conversation)
 end
end
private
 def message_params
  params.require(:message).permit(:body, :user_id)
 end
end
类会话控制器
消息\u controller.rb

class ConversationsController < ApplicationController
  before_action :authenticate_user!

  # GET /conversations
  # GET /conversations.json
  def index
    @users = User.all

    # Restrict to conversations with at least one message and sort by last updated
    @conversations = Conversation.joins(:messages).uniq.order('updated_at DESC')
  end

  # POST /conversations
  # POST /conversations.json
  def create
  if Conversation.between(params[:conversation][:sender_id], params[:conversation][:recipient_id]).present?
    @conversation = Conversation.between(params[:conversation][:sender_id], params[:conversation][:recipient_id]).first
  else
    @conversation = Conversation.create!(conversation_params)
  end

  redirect_to conversation_messages_path(@conversation)
end

  private
    # Use callbacks to share common setup or constraints between actions.
    def conversation_params
      params.require(:conversation).permit(:sender_id, :recipient_id)
    end
end
class MessagesController < ApplicationController
  before_action do
   @conversation = Conversation.find(params[:conversation_id])
  end
def index
 @messages = @conversation.messages
  if @messages.length > 10
   @over_ten = true
   @messages = @messages[-10..-1]
  end
  if params[:m]
   @over_ten = false
   @messages = @conversation.messages
  end
 if @messages.last
  if @messages.last.user_id != current_user.id
   @messages.last.read = true;
  end
 end
@message = @conversation.messages.new
 end
def new
 @message = @conversation.messages.new
end
def create
 @message = @conversation.messages.new(message_params)
 if @message.save
  redirect_to conversation_messages_path(@conversation)
 end
end
private
 def message_params
  params.require(:message).permit(:body, :user_id)
 end
end
class messages控制器10
@超过十个=正确
@messages=@messages[-10..-1]
结束
如果参数[:m]
@超过十个=错误
@messages=@conversation.messages
结束
如果@messages.last
如果@messages.last.user_id!=当前用户id
@messages.last.read=true;
结束
结束
@message=@conversation.messages.new
结束
def新
@message=@conversation.messages.new
结束
def创建
@message=@conversation.messages.new(message_参数)
如果@message.save
重定向到对话消息路径(@conversation)
结束
结束
私有的
def消息参数
参数require(:message).permit(:body,:user\u id)
结束
结束
/对话/index.html.erb

<div class="ui segment">
 <h3>Mailbox</h3>
 <div class="ui list">
  <div class="item">
   <% @conversations.each do |conversation| %>
   <% if conversation.sender_id == current_user.id || conversation.recipient_id == current_user.id %>
    <% if conversation.sender_id == current_user.id %>
      <% recipient = User.find(conversation.recipient_id) %>
    <% else %>
      <% recipient = User.find(conversation.sender_id) %>
    <% end %>
    Conversation avec <%= link_to recipient.prenom,   conversation_messages_path(conversation)%>
   <% end %>
  <% end %>
  </div>
 </div>
</div>
<div class="ui segment">
 <h3>All Users</h3>
  <div class="ui list">
   <% @users.each do |user| %>
    <% if user.id != current_user.id %>
     <div class="item">
   <%= user.prenom %> <%= button_to 'Message me', conversations_path(conversation: { sender_id: current_user.id, recipient_id: user.id }), class: 'btn btn-primary m-t' %>
 </div>
  <% end %>
 <% end %>
 </div>
</div>
<% if @over_ten %>
 <%= link_to 'Show Previous', "?m=all" %>
<% end %>
<div class="ui segment">
 <% @messages.each do |message| %>
  <% if message.body %>
   <% user = User.find(message.user_id) %>
   <div class="item">
    <div class="content">
     <div class="header"><strong><div class="imageavatarmessage"><%= image_tag user.avatar(:thumb), class:"imageavatarmessage" %></div><%= user.prenom %></strong>     <%= message.message_time %></div>
      <div class="list">
       <div class="item">
        <i class="right triangle icon"></i>
         <%= message.body %>
      </div>
    </div>
   </div>
 </div>
 <% end %>
<% end %>
</div>
<%= form_for [@conversation, @message], html: {class: "ui reply form"} do |f| %>
 <div class=”field”>
   <%= f.text_area :body, class: "form-control" %>
 </div>
 <%= f.text_field :user_id, value: current_user.id, type: "hidden" %>
 <div>
   <%= f.submit "Add Reply", class: "ui blue labeled submit icon button" %>
 </div>
<% end %>

邮箱
对话avec
所有用户
messages/index.html.erb

<div class="ui segment">
 <h3>Mailbox</h3>
 <div class="ui list">
  <div class="item">
   <% @conversations.each do |conversation| %>
   <% if conversation.sender_id == current_user.id || conversation.recipient_id == current_user.id %>
    <% if conversation.sender_id == current_user.id %>
      <% recipient = User.find(conversation.recipient_id) %>
    <% else %>
      <% recipient = User.find(conversation.sender_id) %>
    <% end %>
    Conversation avec <%= link_to recipient.prenom,   conversation_messages_path(conversation)%>
   <% end %>
  <% end %>
  </div>
 </div>
</div>
<div class="ui segment">
 <h3>All Users</h3>
  <div class="ui list">
   <% @users.each do |user| %>
    <% if user.id != current_user.id %>
     <div class="item">
   <%= user.prenom %> <%= button_to 'Message me', conversations_path(conversation: { sender_id: current_user.id, recipient_id: user.id }), class: 'btn btn-primary m-t' %>
 </div>
  <% end %>
 <% end %>
 </div>
</div>
<% if @over_ten %>
 <%= link_to 'Show Previous', "?m=all" %>
<% end %>
<div class="ui segment">
 <% @messages.each do |message| %>
  <% if message.body %>
   <% user = User.find(message.user_id) %>
   <div class="item">
    <div class="content">
     <div class="header"><strong><div class="imageavatarmessage"><%= image_tag user.avatar(:thumb), class:"imageavatarmessage" %></div><%= user.prenom %></strong>     <%= message.message_time %></div>
      <div class="list">
       <div class="item">
        <i class="right triangle icon"></i>
         <%= message.body %>
      </div>
    </div>
   </div>
 </div>
 <% end %>
<% end %>
</div>
<%= form_for [@conversation, @message], html: {class: "ui reply form"} do |f| %>
 <div class=”field”>
   <%= f.text_area :body, class: "form-control" %>
 </div>
 <%= f.text_field :user_id, value: current_user.id, type: "hidden" %>
 <div>
   <%= f.submit "Add Reply", class: "ui blue labeled submit icon button" %>
 </div>
<% end %>



我建议您阅读本教程,构建一个漂亮的通知系统

基本上,您必须创建新模型,使用
消息设置依赖项,并集成到控制器

SendMessageMailer.new_message(@message, @message.user, params[:receiver]).deliver_later
对于电子邮件通知,它甚至更简单。 只需在
messages\u controller

def create
 @message = @conversation.messages.new(message_params)
 if @message.save
  SendMessageMailer.new_message(@message).deliver_later
  redirect_to conversation_messages_path(@conversation)
 end
end
编辑: 要创建邮件程序,您应该执行以下操作:

rails g mailer SendMessage
转到/app/mailers/send_message_mailer.rb并添加与控制器类型相同的操作

def new_message(message)
    @message = message
    mail(to: @message.user.email, subject: 'Hey! Here is what you missed')
end
另外,创建一个视图(电子邮件模板)并使用erb代码进行编码

app/views/send_message_mailer/new_message.html.erb
我不会深入讨论这个问题,我想你可以找出如何通过interval(比如说,如果用户在线或已阅读邮件,则不要发送),并与接收方/发送方用户进行区分

同样,Mailer也是同样类型的控制器。您可以根据需要传递任意多个参数,并在mailer控制器和视图中使用模型嵌套

梅勒

def new_message(message, sender, receiver)
end
控制器

SendMessageMailer.new_message(@message, @message.user, params[:receiver]).deliver_later

嘿@sergey khmelevskoy谢谢你的链接和评论。梅勒就是这么简单的吗?差不多就是这样。和往常一样,官方指南是一个很好的参考。