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

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

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

于 2013-11-10T02:32:10.630 回答