rails 指南总结(七)——Model之Active Model 基础

1 属性方法

ActiveModel::AttributeMethods 模块可以为类中的方法添加自定义的前缀和后缀。它用于定义前缀和后缀,对象中的方法将使用它们。

attribute_method_prefix 'reset_'
attribute_method_suffix '_highest?'
define_attribute_methods 'age'

2 回调

ActiveModel::Callbacks 模块为 Active Record 提供回调,在某个时刻运行。定义回调之后,可以使用前置、后置和环绕方法包装

class Person
  extend ActiveModel::Callbacks
  
  define_model_callbacks :update

  def update
    run_callbacks(:update) do
      # 在对象上调用 update 时执行这个方法
    end
  end
  
end

3 转换

如果一个类定义了 persisted? 和 id 方法,可以在那个类中引入 ActiveModel::Conversion 模块,这样便能在类的对象上调用 Rails 提供的转换方法。

class Person
  include ActiveModel::Conversion
 
  def persisted?
    false
  end
 
  def id
    nil
  end
end
 
person = Person.new
person.to_model == person  # => true
person.to_key              # => nil
person.to_param            # => nil

4 弄脏

  • 如果修改了对象的一个或多个属性,但是没有保存,此时就把对象弄脏了。ActiveModel::Dirty 模块提供检查对象是否被修改的功能。
  • 它还提供了基于属性的存取方法。

5 数据验证

ActiveModel::Validations 模块提供数据验证功能,这与 Active Record 中的类似。

6 命名

ActiveModel::Naming 添加一些类方法,便于管理命名和路由。

class Person
  extend ActiveModel::Naming
end
 
Person.model_name.name                # => "Person"
Person.model_name.singular            # => "person"

7 模型

ActiveModel::Model 模块能让一个类立即能与 Action Pack 和 Action View 集成。

  • 引入 ActiveModel::Model 后,将获得以下功能:
    模型名称内省
    转换
    翻译
    数据验证
  • 能像 Active Record 对象那样使用散列指定属性,初始化对象。
  • 只要一个类引入了 ActiveModel::Model,它就能像 Active Record 对象那样使用 form_for、render 和任何 Action View 辅助方法

8 序列化

  • ActiveModel::Serialization 模块为对象提供基本的序列化支持。
  • 你要定义一个属性散列,包含想序列化的属性。属性名必须使用字符串,不能使用符号。
class Person
  include ActiveModel::Serialization
 
  attr_accessor :name
 
  def attributes
    {'name' => nil}
  end
end

这样就可以使用 serializable_hash 方法访问对象的序列化散列:

person = Person.new
person.name = "Bob"
person.serializable_hash   # => {"name"=>"Bob"}
  • Rails 还提供了用于序列化和反序列化 JSON 的 ActiveModel::Serializers::JSON。这个模块自动引入前文介绍过的 ActiveModel::Serialization 模块。
  include ActiveModel::Serializers::JSON

as_json 方法与 serializable_hash 方法相似,用于提供模型的散列表示形式。

person = Person.new
person.as_json # => {"name"=>nil}
person.name = "Bob"
person.as_json # => {"name"=>"Bob"}

还可以使用 JSON 字符串定义模型的属性。然后,要在类中定义 attributes= 方法:

  def attributes=(hash)
    hash.each do |key, value|
      send("#{key}=", value)
    end
  end

现在,可以使用 from_json 方法创建 Person 实例,并且设定属性:

json = { name: 'Bob' }.to_json
person = Person.new
person.from_json(json) # => #<Person:0x00000100c773f0 @name="Bob">
person.name            # => "Bob"

9 翻译

ActiveModel::Translation 模块把对象与 Rails 国际化(i18n)框架集成起来。

class Person
  extend ActiveModel::Translation
end
pt-BR:
  activemodel:
    attributes:
      person:
        name: 'Nome'

使用 human_attribute_name 方法可以把属性名称变成对人类友好的格式。对人类友好的格式在本地化文件中定义。

Person.human_attribute_name('name') # => "Nome"

10 lint 测试

ActiveModel::Lint::Tests 模块测试对象是否符合 Active Model API。

require 'test_helper'
 
class PersonTest < ActiveSupport::TestCase
  include ActiveModel::Lint::Tests
 
  setup do
    @model = Person.new
  end
end

11 安全密码

  • ActiveModel::SecurePassword 提供安全加密密码的功能。
  • 这个模块提供了 has_secure_password 类方法,它定义了一个名为 password 的存取方法,而且有相应的数据验证。
  • ActiveModel::SecurePassword 依赖 bcrypt,因此要在 Gemfile 中加入这个 gem,ActiveModel::SecurePassword 才能正确运行。
  • 为了使用安全密码,模型中必须定义一个名为 password_digest 的存取方法。has_secure_password 类方法会为 password 存取方法添加下述数据验证:
    密码应该存在
    密码应该等于密码确认(前提是有密码确认)
    密码的最大长度为 72(ActiveModel::SecurePassword 依赖的 bcrypt 的要求)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值