首页 > 解决方案 > Rails Action Mailer - 为邮件收件人创建电子邮件通知

问题描述

我正在开发一个 Rails 5 Marketplace 应用程序,并且有一个聊天功能,用户可以在其中互相发送消息。我正在尝试创建一个新的邮件程序,以便在邮件收件人离线时发送给他们。尝试遵循此答案,但一直遇到问题。

user.rb 模型

class User < ApplicationRecord
  has_many :conversations, :foreign_key => :sender_id

对话模型

class Conversation < ApplicationRecord
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

消息模型

class Message < ApplicationRecord
  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 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
        SendMessageMailer.new_message(@message.user, params[:recipient_id]).deliver_later
        redirect_to conversation_messages_path(@conversation)
      end
    end
  
  private
    def message_params
      params.require(:message).permit(:body, :user_id)
    end
  end

发送消息邮件

class SendMessageMailer < ActionMailer::Base
    default from: 'peter@toolsof.golf'
   
    def new_message(message, recipient_id)
        @message = message
        mail(to: @message.email, subject: 'You have a new message')
    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)
      @receiver = @conversation.recipient_id
      if @message.save
        SendMessageMailer.new_message(@message,  @receiver ).deliver
        redirect_to conversation_messages_path(@conversation)
      end
    end
  
  private
    def message_params
      params.require(:message).permit(:body, :user_id, :sender_id, :recipient_id)
    end
  end

发送消息邮件

class SendMessageMailer < ActionMailer::Base
    default from: 'peter@toolsof.golf'
   
    def new_message(message, receiver)
        @receiver = receiver
        mail(to: @receiver.email, subject: 'You have a new message')
    end
  end

标签: ruby-on-railsactionmailer

解决方案


@cadair thank you for your help. I was able to get the following to work:

mailer

class SendMessageMailer < ActionMailer::Base
    default from: 'peter@example.com'
   
    def new_message(message, userSender, userReceiver)
        @recipient =  userReceiver
        @sender = userSender
        @message = message
        mail(to: @recipient.email, subject: 'You have a new message')
    end
  end

Messages Controller:

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)
      userReceiver = User.find(@conversation.recipient_id)
      userSender = User.find(@conversation.sender_id)
      
      if @message.save
        SendMessageMailer.new_message(@message, userSender,  userReceiver ).deliver_later
        redirect_to conversation_messages_path(@conversation)
      end
    end
  
  private
    def message_params
      params.require(:message).permit(:body, :user_id, :sender_id, :recipient_id)
    end
  end

mymailer.html.erb

<h1> New Message </h1>

<p>hello @<%= @recipient.name%> , you've received a new message from @<%= @sender.name %> .</p>


<p> <%= @message.body %></p>

推荐阅读