ruby-on-rails - 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
解决方案
@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>
推荐阅读
- json - Debezium Connector for PostgreSQL 在 JSON 类型的主题数据中引入 \
- c# - UWP Kiosk 模式在 F: 驱动器中打开 FileOpenPicker
- r - 提取公式括号内的信息
- java - 使用 ResponseEntity 获取 Http 响应
- c - 在 C 中的多维数组中添加行和列
- rabbitmq - Azure 服务总线、AWS SNS、RabbitMQ -> 所有订阅者都收到消息?
- java - 在新 IDE 中读取 JSON 文件失败
- c# - 每当用户请求更改密码或由用户管理器自动处理时,我是否必须手动更新安全标记?
- windows - 如何使用 psservice.exe 列出准确的服务名称匹配
- docker - 如何在 Kubernetes (GCP) 中预先配置 Pod 的 IP 地址?