Ruby on rails 使用Desive完成电子邮件确认后,如何将此交易添加到?

Ruby on rails 使用Desive完成电子邮件确认后,如何将此交易添加到?,ruby-on-rails,ruby-on-rails-3,devise,Ruby On Rails,Ruby On Rails 3,Devise,假设现有用户(ID:1367)可以将此url作为邀请发送给他的朋友 http://example.com/users/sign_up?invitation=1367 然后用户表中有一个名为“邀请”的隐藏列 这就是我想要的程序 他的朋友输入信息注册 他点击提交按钮,然后隐藏字段“邀请”也将发送到表单 1367将在记录的“邀请”列中设置 他将收到确认邮件,当他单击链接时,我想添加此交易,并且只为他的帐户执行一次。 当然,当现有用户试图重新激活时,不应执行此操作。 仅适用于新用户的第一次确认 代码

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

http://example.com/users/sign_up?invitation=1367
然后用户表中有一个名为“邀请”的隐藏列

这就是我想要的程序

  • 他的朋友输入信息注册

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

  • 1367
    将在记录的“邀请”列中设置

  • 他将收到确认邮件,当他单击链接时,我想添加此交易,并且只为他的帐户执行一次。
    当然,当现有用户试图重新激活时,不应执行此操作。
    仅适用于新用户的第一次确认

  • 代码

    @user = User.find_by_invitation(current_user.invitation)
    @user.friends = @user.friends + 1
    @user.save
    
    我已经有了注册控制器,可以帮助添加额外的事务来设计。
    现在我想知道如何在我的应用程序中实现此过程

    应该是这样的吗

    注册\u controller.rb

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

    您可以在用户模型上执行此操作。在创建用户后触发一个名为
    的回调

    # 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,将导致回滚,记录将不会保存

    更新:确认后的回调

    不要在创建后使用
    ,而要在保存前使用
    ,并带有
    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
    

    谢谢但关键是在确认完成后激活交易。Deviate会在注册完成后立即创建用户记录,即使尚未确认。我不想因此而给你任何荣誉。我只会在电子邮件确认完成后才给出答案。对不起,我通常会对问题的描述感到迷茫,而忘记阅读标题。更新了我的答案谢谢更新!即使用户从编辑页面保存,它也能工作吗?它不会。只有当确认的_at属性从nil更改为非nil值时,它才会工作。谢谢。最后一个问题。我确实把它放到了user.rb中,但是每次当所有用户都访问users\u controller时,它似乎都会检查并执行刚刚确认的方法。不会让我的应用程序变慢吗?