iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
Software Development

Rails 開發,每日一套件介紹! 系列 第 3

Day 3: 比 id 更友善的 id - friendly_id

  • 分享至 

  • xImage
  •  

Hello, 我是 Weber,一位工程師,斜槓鼓手與行銷顧問。
Rails 開發,每日一套件的第三天,就讓我們循序漸進,輕鬆認識 Rails 開發好用的 30 個套件吧!
相信跟著我一起走完這段旅程,您也能建立出自己的常用套件庫,甚至鑑別什麼是好的套件喔!

Day 3: friendly_id

今天要講的套件,也是一個小巧的套件 - 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

以上大概就是這樣,一樣非常簡單,但是又非常實用的套件。
其實他還有一些客製化的方式,但其實不是很難,套件文件中也都有寫。
如果真的還有什麼不理解的地方,也歡迎留言詢問喔!


上一篇
Day 2:狡詐的偏執狂,你的資料真的都刪除了嗎? - Paranoia
下一篇
Day 4: 程式開發的警備總隊 - rubocop
系列文
Rails 開發,每日一套件介紹! 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言