0

假设现有用户(ID:1367)可以将此网址作为邀请发送给他的朋友。

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

然后用户表有一个隐藏的列名为invitation

这是我想要的程序。

  1. 他的朋友输入信息注册。

  2. 他点击提交按钮,然后隐藏字段“邀请”也将发送到表单。

  3. 1367将在记录的“邀请”列中设置。

  4. 他会收到确认邮件,当他点击链接时,我想添加这个交易,并且只为他的账户执行一次。
    当然,当现有用户尝试重新激活时,不应执行此操作。
    仅用于新用户的第一次确认。

代码

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

我已经有了注册控制器,可以帮助向 Devise 添加额外的事务。
现在我想知道如何在我的应用程序中实现这个过程。

应该是这样的吗?

注册控制器.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_createbefore_saveif选项一起使用

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 回答