Rails生成乱数ID的实现方法

在ROR网站开发中,当我们查询某笔资料时,一般情况下,网址是这样的,如下图:
enter image description here

这样做的缺陷很明显,就是用户可以通过网址猜到我们数据库中user的数据量。为了解决这个问题,我们可以通过把ID改成乱数ID的形式解决,就像下面这样:
enter image description here

实现过程如下:

step1:model层的实现

1- 为 user添加friendly_id 字段

1
$ rails g migration add_friendly_id_to_users

2- 在新生成的migration文件中,为friendly_id 添加唯一索引

1
2
add_column :users, :friendly_id, :string
add_index :users, :friendly_id, :unique => true

1
$ rake db:migrate

3- 修改user.model

1
2
3
4
5
6
7
8
9
before_validation :generate_friendly_id, on: :create

def to_param
self.friendly_id
end

def generate_friendly_id
self.friendly_id ||= SecureRandom.uuid
end

其中to_param Rails中自带的方法,我们在这里对它进行重新定义。之前的定义为,

1
2
3
def to_param
self.id
end

它的作用转换ID,例如user_path(current_user) 就相当于 user_path(current_user.to_param) ,也相当于 user_path(current_user.id)

Step 2 controller层

通常我们的users_controller.rb 会是这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Class UsersController < ApplicationController
# 事例代码
before_action :find_user, only: [:show, :edit, :update]

def show
end

def edit
end

def update
if @user.update
flash[:notice] = "更新成功"
redirect_to users_path
else
render 'edit'
end

private

def find_user
@user = User.find(params[:id])
end
end

我们对其中的 find_user这个方法 做如下修改

1
2
3
def
@user = User.find_by_friendly_id!(params[:id])
end

到这里就可以实现乱数ID的显示了。

豆知识补充

1- “||= ” 符号

a ||= b 相当于 a = a || b ,它的意思为当a的值为nil时,将b的值付给a。例如 上面提到过的self.friendly_id ||= SecureRandom.uuid, 当self.friendly_id的值为空时,将SecureRandom.uuid赋值给它。