1

ユーザーが「フォロー」ボタンをクリックして他のユーザーをフォローできるように、フォロワーモデルを備えたアプリがあります(「フォロー解除」ボタンをクリックしてフォローを解除できます)。新しくフォローしたユーザーにメールを送信したいのですが、その特定のメールを特定の時間枠に1回だけ送信したいと思います。

私の懸念は、AJAXを使用して「フォロー」ボタンと「フォロー解除」ボタンを切り替えることです。ユーザーが(悪意を持ってまたはその他の方法で)そのボタンを繰り返しクリックし続けると、「新しいフォロワー」のメールが送信されます。特定のユーザーに。また、フォローが偶然だった場合は、新しくフォローした人にメールを送信しないようにします。

これが私に関係するいくつかのユースケースです。「JohnDoe」が「新しいフォロワー」であり、「Tommy」がJohnDoeがフォローしている人であるとします。

  1. John Doeは「フォロー」をクリックし、トミーをフォローするつもりはなかったことに気づき、すぐに「フォロー解除」をクリックします。その場合、「新規フォロワー通知」をトミーに送りたくありません。
  2. John Doeは「フォロー」をクリックし、ボタンが自動的に「フォロー解除」に切り替わったのは本当に気の利いたことだと考え、「フォロー」、「フォロー解除」、「フォロー」、「フォロー解除」を何度も繰り返しクリックし始めます。John Doeが[follow]をクリックするたびに、「newfollowernotification」メールでTommyにスパムを送りたくありません。ジョンがボタンで遊んだ後、ジョンが彼をフォローすることになった場合にのみ、そのメールをトミーに送信したいと思います。

私にできることがいくつかあるようです。

  1. 切り替えを避けるために、「フォロー解除」をクリックした後、ビート(おそらく1分)の間「フォロー」ボタンを無効にすることができます。
  2. 「新しいフォロワー」のメールを少し(5分、1時間)延期し、送信する直前に「フォロワー」の関係がまだ存在することを再確認することができます。(これは一般的なことのようですが、方法がわかりません。)
  3. どの関係が電子メールをトリガーしたかを記録し、その関係に関する電子メールを1日1回だけ許可することができました。(「フォロー解除」をクリックするとリレーションシップレコードが破棄されるため、これは複雑になる可能性があります。これをどこに保存するかわかりません。)

これを行う方法について何か提案はありますか?概念的な提案と特定の技術的な提案を探しています(「そのような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 に答える