在ROR网站开发中,当我们查询某笔资料时,一般情况下,网址是这样的,如下图:
这样做的缺陷很明显,就是用户可以通过网址猜到我们数据库中user的数据量。为了解决这个问题,我们可以通过把ID改成乱数ID的形式解决,就像下面这样:
实现过程如下:
step1:model层的实现
1- 为 user添加friendly_id
字段1
rails g migration add_friendly_id_to_users
2- 在新生成的migration文件中,为friendly_id
添加唯一索引1
2add_column :users, :friendly_id, :string
add_index :users, :friendly_id, :unique => true
1 | rake db:migrate |
3- 修改user.model1
2
3
4
5
6
7
8
9before_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
3def 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
24Class 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 | def |
到这里就可以实现乱数ID的显示了。
豆知识补充
1- “||= ” 符号
a ||= b
相当于 a = a || b
,它的意思为当a的值为nil时,将b的值付给a。例如 上面提到过的self.friendly_id ||= SecureRandom.uuid
, 当self.friendly_id
的值为空时,将SecureRandom.uuid
赋值给它。