ユーザーが「フォロー」ボタンをクリックして他のユーザーをフォローできるように、フォロワーモデルを備えたアプリがあります(「フォロー解除」ボタンをクリックしてフォローを解除できます)。新しくフォローしたユーザーにメールを送信したいのですが、その特定のメールを特定の時間枠に1回だけ送信したいと思います。
私の懸念は、AJAXを使用して「フォロー」ボタンと「フォロー解除」ボタンを切り替えることです。ユーザーが(悪意を持ってまたはその他の方法で)そのボタンを繰り返しクリックし続けると、「新しいフォロワー」のメールが送信されます。特定のユーザーに。また、フォローが偶然だった場合は、新しくフォローした人にメールを送信しないようにします。
これが私に関係するいくつかのユースケースです。「JohnDoe」が「新しいフォロワー」であり、「Tommy」がJohnDoeがフォローしている人であるとします。
- John Doeは「フォロー」をクリックし、トミーをフォローするつもりはなかったことに気づき、すぐに「フォロー解除」をクリックします。その場合、「新規フォロワー通知」をトミーに送りたくありません。
- John Doeは「フォロー」をクリックし、ボタンが自動的に「フォロー解除」に切り替わったのは本当に気の利いたことだと考え、「フォロー」、「フォロー解除」、「フォロー」、「フォロー解除」を何度も繰り返しクリックし始めます。John Doeが[follow]をクリックするたびに、「newfollowernotification」メールでTommyにスパムを送りたくありません。ジョンがボタンで遊んだ後、ジョンが彼をフォローすることになった場合にのみ、そのメールをトミーに送信したいと思います。
私にできることがいくつかあるようです。
- 切り替えを避けるために、「フォロー解除」をクリックした後、ビート(おそらく1分)の間「フォロー」ボタンを無効にすることができます。
- 「新しいフォロワー」のメールを少し(5分、1時間)延期し、送信する直前に「フォロワー」の関係がまだ存在することを再確認することができます。(これは一般的なことのようですが、方法がわかりません。)
- どの関係が電子メールをトリガーしたかを記録し、その関係に関する電子メールを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