1

我有一个带有追随者模型的应用程序,以便用户可以通过单击“关注”按钮关注其他用户(他们可以通过单击“取消关注”按钮取消关注)。我想向新关注的用户发送一封电子邮件,但我只想在给定的时间范围内发送该特定电子邮件一次。

我担心的是我正在使用 AJAX 来切换“关注”和“取消关注”按钮,并且用户(恶意或其他方式)很容易重复点击该按钮,从而发送“新关注者”电子邮件给特定的用户。如果关注是偶然的,我也想避免给新关注的人发送电子邮件。

以下是一些我关心的用例。假设“John Doe”是“新追随者”,“Tommy”是 John Doe 关注的人。

  1. John Doe 点击“关注”,意识到他不是有意关注汤米,并迅速点击“取消关注”。在这种情况下,我不想向 Tommy 发送“新关注者通知”。
  2. John Doe 点击“关注”,觉得按钮自动切换到“取消关注”真的很漂亮,然后开始一次又一次地点击“关注”、“取消关注”、“关注”、“取消关注”。我不想在 John Doe 每次点击“关注”时向 Tommy 发送“新关注者通知”电子邮件。如果在约翰完成按钮操作后约翰最终关注他,我只想将那封电子邮件发送给汤米。

似乎有几件事我可以做。

  1. 为了避免切换,我可以在单击“取消关注”后禁用“关注”按钮一段时间(可能是一分钟)。
  2. 我可以将“新关注者”电子邮件推迟一点(五分钟,一个小时),然后在发送之前仔细检查“关注者”关系是否仍然存在。(这似乎是一种常见的事情,但我不知道该怎么做。)
  3. 我可以记录哪个关系触发了这封电子邮件,并且每天只允许一封关于该关系的电子邮件。(这可能会很复杂,因为单击“取消关注”时关系记录会被破坏。我不确定将其存储在哪里。)

关于如何做到这一点的任何建议?我正在寻找概念性建议和具体的技术建议(“使用这样那样的 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
4

1 回答 1

2
  • 创建一个新模型。

  • 每次有人点击“关注”按钮时添加一个时间戳。

  • 当有人单击“关注”按钮时,如果存在时间戳,请将 DateTime.now 与该时间戳进行比较。

  • 如果它在某个分钟/天/周范围内,请不要发送另一封电子邮件。

于 2012-05-13T05:35:20.763 回答