前面大致帶過 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
的其他用法
我們明天見!