(Gorails视频)使用推广链接(params[:ref]),增加注册用户!
用一个链接进行用户的注册推广:
我的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]),增加注册用户!的更多相关文章
- django1.8 增加注册用户其他字段(用户扩展)
在V1.6及之后版本已经删除get_profile()方法,需要使用userprofile. 1.新建moduel,名为UserProfile: class UserProfile(models.Mo ...
- 如何用JS判断推广链接所属的客服
今天有一个客户提出一个需求:网站有多个在线客服,每个客服都有自己的网站推广链接,当访客通过该客服的推广链接进入网站时,必须指定由该客服接待. 我的实现思路是获取推广链接中特定字符,然后判断字符对应的客 ...
- C#的参数修饰符out,params,ref
using System; namespace ParamsProgram { class TestParams { public static void Main(string[] args)//s ...
- c#中的Out, params,ref 细说并沉淀
1. Out,params,ref之前先记录平时用的最多的按值传递参数的情况,当然默认情况下参数传入函数的默认行为也是按值传递的. 1: //默认情况下参数会按照值传递 2: static int a ...
- 增加samba用户提示Failed to add entry for user
1.首先在Ubuntu安装好samba,具体步骤为:安装samba:sudo apt-get install samba安装smbclient:sudo apt-get install 安装smbfs ...
- mysql增加普通用户后无法登陆问题的解决方法
解决方法: 增加普通用户后,执行: mysql> use mysql mysql> delete from user where user=''; mysql> flush priv ...
- mysql 增加删除用户
mysql 增加用户 (注意:因为MYSQL环境中的命令,所以后面都带一个分号作为命令结束符) 格式:grant select on 数据库.* to 用户名@登录主机 identified by ' ...
- (笔记)Mysql命令grant on:增加新用户并控制其权限
grant on命令用于增加新用户并控制其权限. grant on命令格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码”; 1) 增加一个用 ...
- 在Ubuntu中增加root用户登录
一:增加root用户登录 1.打开终端,输入:sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 2.在弹出的编辑框里输入:gree ...
随机推荐
- ImageView控件有关问题
了解了一下ImageView控件,这个控件本身及其属性倒没有什么特别之处.只是在看<第一行代码>时,郭大神写到创建drawable-xhdpi文件有些问题,首先先说drawable和mip ...
- ubuntu18.04无法安装libesd0-dev【学习笔记】
执行如下命令安装: sudo apt-get install libesd0-dev 却报了这个错误: 解决办法: sudo vim /etc/apt/sources.list //在行尾添加如下两行 ...
- SPOJ 694 DISUBSTR - Distinct Substrings
思路 求本质不同的子串个数,总共重叠的子串个数就是height数组的和 总子串个数-height数组的和即可 代码 #include <cstdio> #include <algor ...
- promise对象的使用
ES6中的promise的出现给我们很好的解决了回调地狱的问题,在使用ES5的时候,在多层嵌套回调时,写完的代码层次过多,很难进行维护和二次开发,ES6认识到了这点问题, 现在promise的使用,完 ...
- 所有JTAG集成电路都应该支持菊花链
菊花链 在电气和电子工程中,菊花链是一种布线方案,其中多个设备按顺序或环形连接在一起.相邻设备才能通信.菊花链可用于电源,模拟信号,数字数据或其组合. 但是由于菊花链的串联特性,如果任何一个设备从链路 ...
- Python数据类型补充2
四.列表 常用操作+内置的方法: 1.按索引存取值(正向存取+反向存取):即可存也可以取 # li=['a','b','c','d'] # print(li[-1]) # li[-1]='D' # p ...
- 1、HA Cluster基础原理
Linux Cluster --> linux集群类型分三种: LB:负载均衡,LoadBalance HA:双机集群系统,指高可用性集群,High Available HP:Hadoop ...
- Ural 1297 Palindrome(后缀数组+最长回文子串)
https://vjudge.net/problem/URAL-1297 题意: 求最长回文子串. 思路: 先将整个字符串反过来写在原字符串后面,中间需要用特殊字符隔开,那么只需要某两个后缀的最长公共 ...
- 【Django】【二】模板
1. Django-bootstrap3 guest>python -m pip install django-bootstrap3 [代码] settings.py ""& ...
- _talent_req
学习天赋时,将产生消耗,当玩家已经学习过该天赋时,不产生消耗 comment 备注 spellId 天赋技能ID reqId 消耗模板ID,对应_req表中reqId