---
title: "為 Rails 5 attributes API 新增自訂型別"
description: "Rails 5 的 attributes API 讓我們可以非常輕鬆地建立 form object。"
canonical: https://oozou.com/til/add-new-types-to-rails-5-attributes-api-13
locale: zh-Hant
date: 2020-10-13
topic: ruby-on-rails
---

# 為 Rails 5 attributes API 新增自訂型別

> Rails 5 的 attributes API 讓我們可以非常輕鬆地建立 form object。

Published: 2020-10-13 · Topic: [ruby on rails](https://oozou.com/zh-Hant/til-topics/ruby-on-rails) ([markdown](https://oozou.com/zh-Hant/til-topics/ruby-on-rails.md))

Rails 5 的 attributes API 讓我們可以非常輕鬆地建立 form object。

我之前都是用 after\_initialize callback 把 email 轉成小寫，透過下面這段程式碼，我可以定義一個 :email 資料型別，設定值的時候就會自動轉型。

這樣做的好處是，之後再呼叫設定 email 值時也會自動轉型。

```ruby
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)
```

```ruby
class Foo
  include ActiveModel::Model
  include ActiveModel::Attributes

  attribute :email, :email
end
```

```ruby
> Foo.new(email: 'EMAIL@MAIL.com').email
=> 'email@mail.com'
```

---

Contact OOZOU: hello@oozou.com · +66 2544 0000 · https://oozou.com/zh-Hant/contact

More for AI agents: https://oozou.com/llms.txt · every page has a markdown twin at its URL plus ".md"
