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



我的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属性存储了对应的

(Gorails视频)使用推广链接(params[:ref]),增加注册用户!的更多相关文章

  1. django1.8 增加注册用户其他字段(用户扩展)

    在V1.6及之后版本已经删除get_profile()方法,需要使用userprofile. 1.新建moduel,名为UserProfile: class UserProfile(models.Mo ...

  2. 如何用JS判断推广链接所属的客服

    今天有一个客户提出一个需求:网站有多个在线客服,每个客服都有自己的网站推广链接,当访客通过该客服的推广链接进入网站时,必须指定由该客服接待. 我的实现思路是获取推广链接中特定字符,然后判断字符对应的客 ...

  3. C#的参数修饰符out,params,ref

    using System; namespace ParamsProgram { class TestParams { public static void Main(string[] args)//s ...

  4. c#中的Out, params,ref 细说并沉淀

    1. Out,params,ref之前先记录平时用的最多的按值传递参数的情况,当然默认情况下参数传入函数的默认行为也是按值传递的. 1: //默认情况下参数会按照值传递 2: static int a ...

  5. 增加samba用户提示Failed to add entry for user

    1.首先在Ubuntu安装好samba,具体步骤为:安装samba:sudo apt-get install samba安装smbclient:sudo apt-get install 安装smbfs ...

  6. mysql增加普通用户后无法登陆问题的解决方法

    解决方法: 增加普通用户后,执行: mysql> use mysql mysql> delete from user where user=''; mysql> flush priv ...

  7. mysql 增加删除用户

    mysql 增加用户 (注意:因为MYSQL环境中的命令,所以后面都带一个分号作为命令结束符) 格式:grant select on 数据库.* to 用户名@登录主机 identified by ' ...

  8. (笔记)Mysql命令grant on:增加新用户并控制其权限

    grant on命令用于增加新用户并控制其权限. grant on命令格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码”; 1) 增加一个用 ...

  9. 在Ubuntu中增加root用户登录

    一:增加root用户登录 1.打开终端,输入:sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 2.在弹出的编辑框里输入:gree ...

随机推荐

  1. topcoder srm 709 div1

    1 给定一个长度为n的整数数组A,重排列数组A使得下面计算出的X最大:(n不大于15,A中的大于等于0小于等于50) int X=0; for(int i=0;i<n;++i) X=X+(X^A ...

  2. git如何修改用户名和邮箱名?

    答: 使用git config --global --edit即可进行修改

  3. 集合02_Queue

    Queue集合 模拟队列先进先出(FIFO),不允许随机访问元素 Queue接口定义的方法: //void add(Object e) boolean offer(Object e),加入队列尾部,比 ...

  4. BZOJ4455 小星星

    闲扯 看到多个限制条件的计数题目,就想到容斥原理 思路 题目要求两个条件 - 编号一一对应 - 树上存在的边,在图上映射到的点上也应该存在 考虑一个暴力的dp,设\(dp_{i,j}\)表示i点编号对 ...

  5. p1654 OSU!

    期望DP 设\(g[i]\)表示前i个的连续1的期望长度,\(h[i]\)表示前i个连续1的长度的平方的期望,\(f[i]\)表示前i个的期望得分 由期望的线性性质,我们可以考虑统计新增一个对答案的贡 ...

  6. $mount方法是用来挂载我们的Vue.extend扩展的

    html <body> <div id="app"> <diy></diy> </div> </body> ...

  7. Transaction

    SqlTransaction——事务详解 事务是将一系列操作作为一个单元执行,要么成功,要么失败,回滚到最初状态.在事务处理术语中,事务要么提交,要么中止.若要提交事务,所有参与者都必须保证对数据的任 ...

  8. HDU 4312 Meeting point-2(切比雪夫距离转曼哈顿距离)

    http://acm.hdu.edu.cn/showproblem.php?pid=4312 题意:在上一题的基础上,由四个方向改为了八个方向. 思路: 引用自http://blog.csdn.net ...

  9. springboot读取properties(yml)的几种常用方式

    boot项目中一些秘钥等不常变动的信息大多存储在配置文件中,那么我们怎么获取配置文件中的属性呢? 以获取server端口号为例讲解几种方法:配置信息如下 一:使用@Value注解 @Value(&qu ...

  10. re模块与subprocess模块介绍

    一:re模块       处理正则表达式的模块,正则表达式就是一些带有特殊含义的符号或者符号的组合. 作用:对字符串进行过滤,在一堆字符串中找到你所关心的内容,你就需要告诉计算机你的过滤的 规则是什么 ...