---
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-Hans
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-Hans/til-topics/ruby-on-rails) ([markdown](https://oozou.com/zh-Hans/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-Hans/contact

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