iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0
Software Development

Rails Active Model系列 第 4

D-4 Active Model 擴充功能 - Attributes - 1

  • 分享至 

  • xImage
  •  

前面大致帶過 Active Model 的基本功能了,接著再講講擴充功能 ActiveModel::Attributes

class MyClass
  include ActiveModel::Model
  include ActiveModel::Attributes
  # 只要在 Model 後 include 這個 module,就可以讓你的 form object 多出一個特異功能:attribute
  
  attribute :title, :string
  # 第一個是輸入欄位名稱,第二個是指定轉換器,會自動幫你轉換資料型別

  attribute :number, :integer
  # 內建可支援數種基本型別

  attribute :content
  # 也可以不指定資料型別,他就不會做任何資料轉換

  attribute :custom_field, :custom_type
  attribute :custom_field, CustomType.new
  # 或者也可以帶入自定義的資料轉換器
  # 之後會提到要怎麼做
end


這個 attribute 的功能,除了會送你 (attr) & (attr)= 兩個 methods 之外,還會自動根據第二個參數指定的轉換器,來自動對輸入的資料進行型別轉換

下面來實驗看看

params = { title: '標題文字', number: '123'} # params 假設都是字串
obj = MyClass.new params
obj.title
 => "標題文字" # 正常發揮

obj.number
=> 123 # 自動轉型成功!

是不是很方便!

另外來大致介紹一下 Rails 內建既有的可以讓 attribute 直接使用的轉換器已有以下:

:string
:integer
:float
# 以上是最常使用的轉換器,應該很直觀XD
# 要注意 string 轉換器如果在該欄位傳入 true or false ,通過 string 轉換器會被轉成 "t" or "f"

:boolean
# 會把前端送來的諸如 '1', '0', 'true', 'false' 等等轉為 true or false,超級方便!

:date
:time
:datetime
# 這三個就是把前端傳來的時間資訊的字串 parse 為時間 object

:binary
# 如果有傳入檔案的需求,則可以使用這個

:big_integer
# :integer 可接受範圍在 -2147483648 ~ 2147483648 如果會超過請用 :big_integer

:decimal
:immutable_string
# 這幾個尚不知用途為何。囧

不知道細心的讀者有沒有發現,這可以使用的轉換器裡面,竟然沒有 Hash and Array?不過不要緊,我們可以自行依照專案需求,建立自訂且可共用的轉換器,進行擴充!這個之後會介紹 XD

下一回會再繼續介紹 attribute 的其他用法
我們明天見!


上一篇
D-3 Active Model 本身有什麼功能? - define_model_callbacks
下一篇
D-5 Active Model 擴充功能 - Attributes - 2
系列文
Rails Active Model28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言