在Rails 4中包含ActiveModel与ActiveModel :: Model有什么区别?

时间:2014-05-01 13:42:59

标签: ruby-on-rails ruby-on-rails-4

我认为包括ActiveModel允许您以与ActiveRecord相同的方式处理对象,而不会将其持久保存到数据库中。我知道ActiveModel::Model允许您进行验证等,但不仅仅包括ActiveModel也可以这样做吗?

1 个答案:

答案 0 :(得分:2)

不,不一样。包含ActiveModel并不能为您提供验证方法。 ActiveModel::Model为您提供的方法之一是persisted?,默认情况下返回false。您可以在Rails控制台中通过测试验证这一点:

class Test; include ActiveModel; end; Test.new.persisted?
# NoMethodError: undefined method `persisted?' for #<Test:0x007f84ddd6d620>

class Test; include ActiveModel::Model; end; Test.new.persisted?
# false

ActiveModel模块仅定义了对自动加载子模块(check the source)的一些引用。它实际上并没有将任何方法混合到你的班级中。

另一方面,

ActiveModel::Model会在您包含它时执行某些操作:

def self.included(base)
  base.class_eval do
    extend  ActiveModel::Naming
    extend  ActiveModel::Translation
    include ActiveModel::Validations
    include ActiveModel::Conversion
  end
end

当您加入ActiveModel::Model时,会调用included方法,其中包括ActiveModel::NamingActiveModel::Validations等。这些方法会将方法混合到您的班级中。另请参阅ActiveModel::Model的{​​{3}}。