我有一个带有追随者模型的应用程序,以便用户可以通过单击“关注”按钮关注其他用户(他们可以通过单击“取消关注”按钮取消关注)。我想向新关注的用户发送一封电子邮件,但我只想在给定的时间范围内发送该特定电子邮件一次。
我担心的是我正在使用 AJAX 来切换“关注”和“取消关注”按钮,并且用户(恶意或其他方式)很容易重复点击该按钮,从而发送“新关注者”电子邮件给特定的用户。如果关注是偶然的,我也想避免给新关注的人发送电子邮件。
以下是一些我关心的用例。假设“John Doe”是“新追随者”,“Tommy”是 John Doe 关注的人。
- John Doe 点击“关注”,意识到他不是有意关注汤米,并迅速点击“取消关注”。在这种情况下,我不想向 Tommy 发送“新关注者通知”。
- John Doe 点击“关注”,觉得按钮自动切换到“取消关注”真的很漂亮,然后开始一次又一次地点击“关注”、“取消关注”、“关注”、“取消关注”。我不想在 John Doe 每次点击“关注”时向 Tommy 发送“新关注者通知”电子邮件。如果在约翰完成按钮操作后约翰最终关注他,我只想将那封电子邮件发送给汤米。
似乎有几件事我可以做。
- 为了避免切换,我可以在单击“取消关注”后禁用“关注”按钮一段时间(可能是一分钟)。
- 我可以将“新关注者”电子邮件推迟一点(五分钟,一个小时),然后在发送之前仔细检查“关注者”关系是否仍然存在。(这似乎是一种常见的事情,但我不知道该怎么做。)
- 我可以记录哪个关系触发了这封电子邮件,并且每天只允许一封关于该关系的电子邮件。(这可能会很复杂,因为单击“取消关注”时关系记录会被破坏。我不确定将其存储在哪里。)
关于如何做到这一点的任何建议?我正在寻找概念性建议和具体的技术建议(“使用这样那样的 gem”或“在关系控制器中的“创建”操作上尝试这个 after_filter”)。
这是用于生成此电子邮件的代码:
#relationships_controller.rb
class RelationshipsController < ApplicationController
before_filter :authenticate
def create
@user = User.find(params[:relationship][:followed_id])
if current_user.follow!(@user)
# Send new_follower email if followed user has opted in to that email
UserMailer.new_follower_notification(@user, current_user).deliver if @user.master_switch && @user.new_follower_notification
end
respond_to do |format|
format.html { redirect_to @user }
format.js
end
def destroy
...
end
end
#user_mailer.rb
class UserMailer < ActionMailer::Base
def new_follower_notification(user, follower)
@user = user
@follower = follower
mail(:from => "Example <example@example.com", :to => "#{@user.name} <#{@user.email}>", :subject => "#{@follower.name} (#{@follower.username}) is now following you!")
end
end