Rails: 建立 Permalink,避免流水號洩漏網站資料
首先在 Table 裡面加上 permalink
column,如果你是要在既有的 table 上新增,可以使用 migration 來新增欄位(當然你也可以砍掉重練 XD)
class AddPermalink < ActiveRecord::Migration
def self.up
add_column :posts, :permalink, :string
add_index :posts, :permalink, :unique => true
end
def self.down
remove_index :posts, :permalink
remove_column :posts, :permalink
end
end
接下來在 Model 裡面定義 permalink 的產生方式
class Post < ActiveRecord::Base
before_create :generate_permalink
protected
def generate_permalink
# 定義 permalink 的產生方式
self.permalink = Time.now.strftime("%Y-%m-%d_") + rand(100000).to_s
end
end
這邊我是用時間加亂數的方式產生 permalink,事實上這樣的寫法還是有可能重複,不如用 SHA 或 MD5 的方式來產生 Permalink 也不錯(雖然長了點)。
class Post < ActiveRecord::Base
before_create :generate_permalink
protected
def generate_permalink
# 用標題 + 時間進行 md5 的編碼
require 'digest/md5'
self.permalink = Digest::MD5.hexdigest(self.title + Time.now.to_s)
end
end
往後在連結可以使用:
link_to post.title,
:controller => "post",
:action => "show",
:id => post.permalink
在 Controller 裡面 Action 的寫法則是:
class PostController < ApplicationController
def show
@post = Post.find_by_permalink(params\[:id\])
end
end