Hello, 我是 Weber,一位工程師,斜槓鼓手與行銷顧問。
Rails 開發,每日一套件的第三天,就讓我們循序漸進,輕鬆認識 Rails 開發好用的 30 個套件吧!
相信跟著我一起走完這段旅程,您也能建立出自己的常用套件庫,甚至鑑別什麼是好的套件喔!
今天要講的套件,也是一個小巧的套件 - friendly_id。你可能會問, id 就 id,為什麼會需要 friendly 的 id 呢?
以訂單號碼為例,在一般的狀況下,可能會顯示https://example.com/orders/20230414007
。
除了 id 很醜之外,另外還有會無意間透露了訂單資訊的間接問題,很容易就猜得出你的資料結構。
甚至如果你這個 id 是使用者的 id,在網頁後端的驗證又沒有做得很完善的話。等於透過更改 id 數字,非常容易被惡意的有心人士猜到,進而破壞你資料庫的資料。
透過 friendly_id 的套件,客製化你的顯示 id 名稱。比方說,原本個人資料檔案的網址為:https://example.com/profiles/1
改為 https://example.com/profiles/davidlin
一來可以讓你的顯示 id 更人性化一點,二來也間接保護你的資料結構不會太容易被惡意人士猜到。
首先在終端機輸入:
bundle add friendly_id
接著在加入 slug 這個欄位,在你想要"友善"的資料表,以下以users為例:
migration 的名稱隨意,好讀為主,uniq 則是指不重複
rails g migration AddSlugToUsers slug:uniq
會產出這樣的 migration
class AddSlugToUsers < ActiveRecord::Migration[7.0]
def change
add_column :users, :slug, :string
add_index :users, :slug, unique: true
end
end
接著rails g friendly_id
然後rails db:migrate
,並在想要改變的 model 中寫入以下,一樣以User為例:
class User < ApplicationRecord
extend FriendlyId
friendly_id :name, use: :slugged
end
Controller 內也要調整,原本的 .find 都要改為 friendly.find
class UserController < ApplicationController
def show
@user = User.friendly.find(params[:id])
end
end
以上大概就是這樣,一樣非常簡單,但是又非常實用的套件。
其實他還有一些客製化的方式,但其實不是很難,套件文件中也都有寫。
如果真的還有什麼不理解的地方,也歡迎留言詢問喔!