用一个链接进行用户的注册推广:



我的git:   https://github.com/chentianwei411/embeddable_comments

用途:比如推广,拉朋友注册,给推广码,用这个码注册就知道是谁推广的了。

使用这个链接注册的用户,它的user记录中的referred_by_id会储存给它这个链接的用户的id。

也就是说通过ref这个参数,新注册的user和有这个referral_code的user建立了关联。

rails new -m template.rb referral_app

cd referral_app

rails g migration AddReferralsToUsers referral_code referred_by_id:integer referral_completed_at:datetime
  • referral_code:一个转移码
  • referred_by_id: 关联的user的id
  • referral_completed_at: 转移的时间。
rails db:migrate

设置自我关联:

class User < ApplicationRecord

  //belongs_to代表这个user由谁转移的"referred_by who"
belongs_to :referred_by, class_name: "User", optional: true
//has_many代表这个user转移了很多转移用户, 转移用户通过外键referred_by_id关联上这个user
has_many :referred_users, class_name: "User", foreign_key: :referred_by_id before_create :set_referral_code
#validates :referral_code, uniqueness: true
//不需要这条验证,因为set_referral_code会生成不同的字符串 def set_referral_code
loop do
self.referral_code = SecureRandom.hex(6) //生成一个随机的16进制的字符串。12个字符
// 加一个判断,如果这个随机数已经存在于User的记录内,则再次♻️,生成一个随机数并判断
    if self.class.exists?(referral_code: referral_code)
     next
else
break
end
end
end after_create :complete_referral!
//当完成转移后,更新转移的时间。
def complete_referral!
update(referral_completed_at: Time.zone.now)
// 可以增加referred_by user的信用或者发送email,等等其他操作!
end
end

设置ApplicationController

使用这个链接的人都会在他的浏览器的cookies中储存这个参数params[:ref]

class ApplicationController < ActionController::Base
//...略
// 任何行为,都会把url中的参数ref存储在cookies中并保持30天
before_action :set_referral_cookie protected def set_referral_cookie
if params[:ref]
cookies[:referral_code] = {
value: params[:ref],
expires: 30.days.from_now,
}
end
end
end

进入routes.rb, 重写registrationsController中的create方法:

devise_for :users, controllers:{..., registrations: 'users/registrations'}

新建controllers/user/registrations_controller.rb

浏览器输入github.com/plataformatec/devise

然后点击find file按钮。

查找registrations_controller.rb文件。

看create方法,其实只需要修改其中的build_resource()方法。所以:

class Users::RegistrationsController < Devise::RegistrationsController
//打开git,重写create方法,但不需要,只需要重写create中调用的build_resource方法即可
def build_resource(hash = {})
super //调用这个原方法
//然后再加上自己写的代码:
// 如果cookies存在,并且这个cookies的值能够在数据库中的User记录中找到对应的user记录。
if cookies[:referral_code] && referrer = User.find_by(referral_code: cookies[:referral_code])
//resource是一个hash,因此新增一个属性referred_by(关联的对象)。
//新建的user中的referred_by_id属性存储了对应的

最新文章

  1. zx一篇让Java程序猿随时可以翻看的Oracle总结
  2. JSP内置对象---response 响应
  3. Ruby on rails学习笔记——安装环境
  4. OAuth2授权页面state参数的设计
  5. DateTime季度的计算
  6. Java多态与C++中多态的实现
  7. Introduction to Machine Learning
  8. Dijkstra最短路径算法[贪心]
  9. 使用 LD_PRELOAD 变量拦截调用
  10. 使用chttpfile的一个错误
  11. 远程执行shell脚本
  12. mybatis通用mapper源码解析(一)
  13. Oracle11g ADG环境实施文档-1204
  14. unity, ContentSizeFitter立即生效
  15. oracle用户名和密码到期后如何处理
  16. Lambda表达式学习记录
  17. bootstrap学习笔记(5)
  18. 【详解】Linux的文件描述符fd与文件指针FILE*互相转换
  19. curl错误码77 及 升级libcurl
  20. 21-spring学习-springMVC实现CRUD

热门文章

  1. 几道cf水题
  2. Flask学习【第7篇】:Flask中的wtforms使用
  3. P4172 [WC2006]水管局长
  4. NodeJs 在window中安装使用
  5. facebook api call——error
  6. HBase底层存储原理
  7. Latex: 添加IEEE论文keywords
  8. 【十六】php 面向对象
  9. 用html+css+js实现选项卡切换效果
  10. 传的参数是url地址时需要特殊处理