為 Rails 5 attributes API 新增自訂型別
October 13, 2020
Rails 5 的 attributes API 讓我們可以非常輕鬆地建立 form object。
我之前都是用 after_initialize callback 把 email 轉成小寫,透過下面這段程式碼,我可以定義一個 :email 資料型別,設定值的時候就會自動轉型。
這樣做的好處是,之後再呼叫設定 email 值時也會自動轉型。
class EmailType < ActiveModel::Type::String
def cast(value)
return super unless value.is_a?(String)
super(value.downcase)
end
end
ActiveModel::Type.register(:email, EmailType)
class Foo
include ActiveModel::Model
include ActiveModel::Attributes
attribute :email, :email
end
> Foo.new(email: 'EMAIL@MAIL.com').email
=> 'email@mail.com'