使用SecureRandom.uuid将网址加密

Step 1.网址上除了数字ID,可以再加上文字

修改app/models/job.rb,加上一个to_param方法

def to_param
     "#{self.id}-#{self.title}" ##可更换title,输出相应的文字
  end

这样就好了,出来的网址就会变成 /jobs/123-名称
to_param方法其实是一个 Rails 默认就有的方法


Step 2.如何生成乱数ID

不要用数据库的递增数字ID,而是用一个乱数产生的 ID

在终端执行 rails g migration add_friendly_id_to_jobs新增另一个字段到jobs

编辑201904XXXXXXXX_add_friendly_id_to_jobs.rb


def change
+     add_column :jobs, :friendly_id, :string
+     add_index :jobs, :friendly_id, :unique => true

+     Job.find_each do |e|
+       e.update( :friendly_id => SecureRandom.uuid )
+     end
    end

在终端运行 rake db:migrate

编辑app/controllers/jobs_controller改用 friendly_id 这个字段来找 job


def show
-    @job = Job.find(params[:id])
+    @job = Job.find_by_friendly_id!(params[:id])
   end

   def edit
-    @job = Job.find(params[:id])
+    @job = Job.find_by_friendly_id!(params[:id])

   def update
-    @job = Job.find(params[:id])
+    @job = Job.find_by_friendly_id!(params[:id])

   def destroy
-    @job = Job.find(params[:id])
+    @job = Job.find_by_friendly_id!(params[:id])

编辑 app/models/job.rb修改 to_param 改成用 friendly_id,並在新增的时候自动产生乱数的 friendly_id。


 before_validation :generate_friendly_id, :on => :create

    def to_param
-     "#{self.id}-#{self.title}"
+     self.friendly_id
    end

+   protected

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


Step 3.用户可以自定义 ID

基于方案二,我们只要让管理员可以编辑 friendly_id 字段即可:

编辑 app/views/admin/events/_form.html.erb


<div class="form-group">
+  <%= f.label :friendly_id %>
+  <%= f.text_field :friendly_id, required: true, class: "form-control" %>
+  <p class="help-block">限小写英数字及横线,将作为网址的一部分</p>
+</div>

编辑 app/controllers/admin/events_controller.rb


def job_params
-    params.require(:event).permit(:job, :description)
+    params.require(:event).permit(:job, :description, :friendly_id)
   end

由于这个字段输入的资料,会出现在网址上,所以最好加上一些资料验证:
编辑 app/models/event.rb


validates_presence_of :name
+  validates_presence_of :title, :friendly_id
+
+  validates_uniqueness_of :friendly_id
+  validates_format_of :friendly_id, :with => /\A[a-z0-9\-]+\z/

这里不但要检查必填,还检查了必须唯一,而且格式只限小写英数字及横线。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容