0

既存のユーザー (ID:1367) がこの URL を友人に招待状として送信できると仮定します。

http://example.com/users/sign_up?invitation=1367

次に、Users テーブルには という非表示の列がありますinvitation

そして、これは私が望む仕組みです。

  1. 彼の友人はサインアップするために情報を入力しました。

  2. 送信ボタンを押すと、隠しフィールド「招待状」もフォームに送信されます。

  3. 1367レコードの「招待状」という欄に設定されます。

  4. 彼は確認メールを受け取り、リンクをクリックしたら、このトランザクションを追加して、彼のアカウントに対して 1 回だけ実行したいと考えています。
    もちろん、既存のユーザーが再アクティブ化を試みたときにこれを実行するべきではありません。
    新規ユーザーの初回確認のみ。

コード

@user = User.find_by_invitation(current_user.invitation)
@user.friends = @user.friends + 1
@user.save

Devise に追加のトランザクションを追加するのに役立つ登録コントローラーが既にあります。
この手順をアプリに実装する方法を知りたいと思います。

それはこのようなものであるべきですか?

registrations_controller.rb

def after_????????
    if @user = User.find_by_invitation(current_user.invitation)
        @user.friends = @user.friends + 1
        @user.save
    end
end
4

1 に答える 1

2

ユーザーモデルでこれを行うことができます。after_createユーザーの作成後にトリガーされるコールバックを使用します。

# user.rb
after_create :handle_invitation_code

private

def handle_invitation_code
  # do something with invitation here
  # i'm assuming that you want to credit
  # whoever it is that invited this user
  # assuming that invitation contains the
  # id of the referrer
  if referrer = User.find_by_id(invitation)
    # do something with referrer
  end
end

コールバックで false を返すと、ロールバックが発生し、レコードが保存されないことに注意してください。

更新: 確認後のコールバック

を使用する代わりに、オプションafter_createで使用before_saveしますif

before_save :handle_invitation_code, if: :just_confirmed?

def just_confirmed?
  confirmed_at_changed? && confirmed_at_was.nil?
end

def handle_invitation_code
  ...
end
于 2013-02-08T01:58:47.647 に答える