我不确定我是否应该在控制器或模型中执行此事务,因为我必须计算并更改其他用户的列值。
根据我的理解,在模型中陈述只是为了改变自身的价值(这里是用户自我)
现有用户(ID:1367)可以将此网址作为邀请发送给他的朋友。
http://example.com/users/sign_up?invitation=1367
然后,Users表具有名为invitation
的隐藏列。
这是我想要的程序。
他的朋友输入信息进行注册。
他点击提交按钮然后隐藏字段'邀请'也将被发送到表单。
1367
将在记录中名为“邀请”的列中设置。
他将收到确认邮件,当他点击链接时,我想添加此交易,并且只对他的帐户执行一次。
当然,当现有用户尝试重新激活时,不应该执行此操作
仅适用于新用户的第一次确认。
码
@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
答案 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
公平警告:我没有对此进行测试 - 但这是我采取的方法。