设备注册确认后如何添加交易

时间:2013-11-10 01:20:00

标签: ruby-on-rails ruby-on-rails-3 devise

我不确定我是否应该在控制器或模型中执行此事务,因为我必须计算并更改其他用户的列值。

根据我的理解,在模型中陈述只是为了改变自身的价值(这里是用户自我)

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

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

然后,Users表具有名为invitation的隐藏列。

这是我想要的程序。

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

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

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

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

  5. @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
    

1 个答案:

答案 0 :(得分:0)

我会在after_create上使用User回调,但只有在朋友邀请用户时才调用回调(例如,设置了表单上的隐藏字段)。所以,像:

class User << ActiveRecord::Base

  attr_accessor :inviter_user_id

  after_create :increment_inviter_user, :if => lambda {|u| u.inviter_user_id.present?}

  private

  def increment_inviter_user
    inviter = User.find(inviter_user_id)

    return false unless inviter.present?

    inviter.friends += 1

    inviter.save
  end

end

然后在新用户的signup控制器中,您可以将新用户的inviter_user_id访问者设置为隐藏字段值。

class UserController << ApplicationController

  def signup
    @user = User.new(user_permitted_params) # or whatever logic you use to create a user

    @user.inviter_user_id = params[:invitation] if params[:invitation].present?

    if @user.save
      ...
    end
  end

end

公平警告:我没有对此进行测试 - 但这是我采取的方法。