首先在 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