Spec-Zone.ru › Ruby on Rails 7.1

модуль ActiveModel

Active Model – модели интерфейсы для Rails

Active Model предоставляет набор известных интерфейсов для использования в классах моделей. Они позволяют помощникам Action Pack взаимодействовать с моделями, не являющимися Active Record, например. Active Model также помогает создавать пользовательские ORM для использования вне фреймворка Rails.

Вы можете узнать больше о Active Model в руководстве Основы Active Model.

До Rails 3.0, если разработчик плагина или драгоценного камня хотел, чтобы объект взаимодействовал с помощниками Action Pack, требовалось либо скопировать фрагменты кода из Rails, либо изменить помощников, чтобы они обрабатывали объекты, которые не полностью соответствуют интерфейсу Active Record. Это приводило к дублированию кода и хрупким приложениям, которые ломались при обновлениях. Active Model решает эту проблему, определяя явный API. Вы можете узнать больше об API в ActiveModel::Lint::Tests.

Active Model предоставляет модуль по умолчанию, который реализует базовые API, необходимые для интеграции с Action Pack из коробки: ActiveModel::API.

class Person
  include ActiveModel::API

  attr_accessor :name, :age
  validates_presence_of :name
end

person = Person.new(name: 'bob', age: '18')
person.name   # => 'bob'
person.age    # => '18'
person.valid? # => true

Он включает в себя интроспекцию имени модели, преобразования, переводы и валидации, что приводит к классу, пригодного для использования с Action Pack. Смотрите ActiveModel::API для получения дополнительных примеров.

Active Model также предоставляет следующие функции для обеспечения поведения наподобие ORM из коробки:

  • Добавление магических атрибутов к объектам

    class Person
      include ActiveModel::AttributeMethods
    
      attribute_method_prefix 'clear_'
      define_attribute_methods :name, :age
    
      attr_accessor :name, :age
    
      def clear_attribute(attr)
        send("#{attr}=", nil)
      end
    end
    
    person = Person.new
    person.clear_name
    person.clear_age
    

    Узнать больше

  • Callbacks для определенных операций

    class Person
      extend ActiveModel::Callbacks
      define_model_callbacks :create
    
      def create
        run_callbacks :create do
          # Your create action methods here
        end
      end
    end
    

    Это генерирует before_create, around_create и after_create методы класса, которые оборачивают ваш метод create.

    Узнать больше

  • Отслеживание изменений значений

    class Person
      include ActiveModel::Dirty
    
      define_attribute_methods :name
    
      def name
        @name
      end
    
      def name=(val)
        name_will_change! unless val == @name
        @name = val
      end
    
      def save
        # do persistence work
        changes_applied
      end
    end
    
    person = Person.new
    person.name             # => nil
    person.changed?         # => false
    person.name = 'bob'
    person.changed?         # => true
    person.changed          # => ['name']
    person.changes          # => { 'name' => [nil, 'bob'] }
    person.save
    person.name = 'robert'
    person.save
    person.previous_changes # => {'name' => ['bob, 'robert']}
    

    Узнать больше

  • Добавление интерфейса errors к объектам

    Возвращение сообщений об ошибках позволяет объектам беспрепятственно взаимодействовать с помощниками Action Pack.

    class Person
    
      def initialize
        @errors = ActiveModel::Errors.new(self)
      end
    
      attr_accessor :name
      attr_reader   :errors
    
      def validate!
        errors.add(:name, "cannot be nil") if name.nil?
      end
    
      def self.human_attribute_name(attr, options = {})
        "Name"
      end
    end
    
    person = Person.new
    person.name = nil
    person.validate!
    person.errors.full_messages
    # => ["Name cannot be nil"]
    

    Узнать больше

  • Model интроспекция имени

    class NamedPerson
      extend ActiveModel::Naming
    end
    
    NamedPerson.model_name.name   # => "NamedPerson"
    NamedPerson.model_name.human  # => "Named person"
    

    Узнать больше

  • Делаем объекты сериализуемыми

    ActiveModel::Serialization предоставляет стандартный интерфейс для вашего объекта, чтобы предоставить to_json сериализацию.

    class SerialPerson
      include ActiveModel::Serialization
    
      attr_accessor :name
    
      def attributes
        {'name' => name}
      end
    end
    
    s = SerialPerson.new
    s.serializable_hash   # => {"name"=>nil}
    
    class SerialPerson
      include ActiveModel::Serializers::JSON
    end
    
    s = SerialPerson.new
    s.to_json             # => "{\"name\":null}"
    

    Узнать больше

  • Поддержка локализации (i18n)

    class Person
      extend ActiveModel::Translation
    end
    
    Person.human_attribute_name('my_attribute')
    # => "My attribute"
    

    Узнать больше

  • Поддержка валидации

    class Person
      include ActiveModel::Validations
    
      attr_accessor :first_name, :last_name
    
      validates_each :first_name, :last_name do |record, attr, value|
        record.errors.add attr, "starts with z." if value.start_with?("z")
      end
    end
    
    person = Person.new
    person.first_name = 'zoolander'
    person.valid?  # => false
    

    Узнать больше

  • Пользовательские валидаторы

    class HasNameValidator < ActiveModel::Validator
      def validate(record)
        record.errors.add(:name, "must exist") if record.name.blank?
      end
    end
    
    class ValidatorPerson
      include ActiveModel::Validations
      validates_with HasNameValidator
      attr_accessor :name
    end
    
    p = ValidatorPerson.new
    p.valid?                  # =>  false
    p.errors.full_messages    # => ["Name must exist"]
    p.name = "Bob"
    p.valid?                  # =>  true
    

    Узнать больше

Загрузка и установка

Последнюю версию Active Model можно установить с помощью RubyGems:

$ gem install activemodel

Исходный код можно загрузить как часть проекта Rails на GitHub

  • github.com/rails/rails/tree/main/activemodel

Лицензия

Active Model распространяется по лицензии MIT:

  • opensource.org/licenses/MIT

Поддержка

API документация находится по адресу:

  • api.rubyonrails.org

Отчеты об ошибках для проекта Ruby on Rails можно отправить сюда:

  • github.com/rails/rails/issues

Запросы на новые функции следует обсуждать на списке рассылки rails-core здесь:

  • discuss.rubyonrails.org/c/rubyonrails-core

Общедоступные методы класса

eager_load!() Показать исходный код
# File activemodel/lib/active_model.rb, line 76
def self.eager_load!
  super
  ActiveModel::Serializers.eager_load!
end
Вызов метода суперкласса
gem_version() Показать исходный код
# File activemodel/lib/active_model/gem_version.rb, line 5
def self.gem_version
  Gem::Version.new VERSION::STRING
end

Возвращает текущую загруженную версию Active Model в качестве Gem::Version.

version() Показать исходный код
# File activemodel/lib/active_model/version.rb, line 7
def self.version
  gem_version
end

Возвращает текущую загруженную версию Active Model в качестве Gem::Version.

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API