GitHub PullRequestReviewCommentEvent at 2014-04-21 17:12:09
Repository: rusrails
Actor: khusnetdinov
Payload: {"comment":{"url":"https://api.github.com/repos/morsbox/rusrails/pulls/comments/11815350","id":11815350,"diff_hunk":"@@ -0,0 +1,198 @@\n+Основы Active Model\n+===================\n+Это руководство познакомит вас со всем, что вам надо для начала использования моделей классов. Active Model позволяет Actions Pack хелперам работать с не Active Record моделями. Дополнительно Active Model может помочь с построением гибкой, настраиваемой ORM для использования вне Rails фреймворка.\n+\n+После прочтение данного руководства, вы узнаете:\n+--------------------------------------------------------------------------------\n+\n+Введение\n+--------\n+\n+Библиотека Active Model содержит различные модули используемые для разработки фрейимворков, необходимых для взаимодействия с Rails Action Pack. Active Model содержит множество интерфейсов для использования в классах. Некоторые из модулей объясняются ниже.\n+\n+### AttributeMethods\n+\n+Модуль AttributeMethods позволяет добавлять различные суффиксы и префиксы к мотодам класса. Для использования укажите суффиксы и префиксы, метод для которого они будут добавлены.\n+\n+```ruby\n+class Person\n+  include ActiveModel::AttributeMethods\n+\n+  attribute_method_prefix 'reset_'\n+  attribute_method_suffix '_highest?'\n+  define_attribute_methods 'age'\n+\n+  attr_accessor :age\n+\n+  private\n+    def reset_attribute(attribute)\n+      send(\"#{attribute}=\", 0)\n+    end\n+\n+    def attribute_highest?(attribute)\n+      send(attribute) > 100\n+    end\n+end\n+\n+person = Person.new\n+person.age = 110\n+person.age_highest?  # true\n+person.reset_age     # 0\n+person.age_highest?  # false\n+```\n+\n+### Callbacks\n+\n+Модуль Callback дает Active Record возможность использования функций обратного вызова (колбек). Это позволяет определять функции обратного вызовы, которые вызываются соответствующее количество раз вызову заданного метода. После определения колбека вы можете обернуть их дополнительным функционалом before и after, которые позволяют определить момент вызова колбека до или после вызова нужного метода.\n+\n+```ruby\n+class Person\n+  extend ActiveModel::Callbacks\n+\n+  define_model_callbacks :update\n+\n+  before_update :reset_me\n+\n+  def update\n+    run_callbacks(:update) do\n+      # Этот метод вызывается при вызове у обьекта метода update.\n+    end\n+  end\n+\n+  def reset_me\n+    # Этот метод вызывается при вызове у обьекта метода update, выполнение метода reset_me произойдет до вызова update, т.к он определен как колбек before_update\n+  end\n+end\n+```\n+\n+### Conversion\n+\n+Если у класса определены `persisted?` и `id` методы, то вы можете добавить модуль преобразования в этот класс и использовать методы преобразования Rails.\n+\n+```ruby\n+class Person\n+  include ActiveModel::Conversion\n+\n+  def persisted?\n+    false\n+  end\n+\n+  def id\n+    nil\n+  end\n+end\n+\n+person = Person.new\n+person.to_model == person  # => true\n+person.to_key              # => nil\n+person.to_param            # => nil\n+```\n+\n+### Dirty\n+\n+Объект становится грязным после большого количества изменений его атрибутов, и при этом он не сохранен. Данный модуль дает возможность проверить объект, был ли он изменен или нет. Дополнительно представлены методы доступа атрибутов. Представим, что класс Person с атрибутами `first_name` и `last_name`:","path":"source/active_model_basics.md","position":93,"original_position":93,"commit_id":"bf81517a35e5a73dbf7074318f79a4c29888661a","original_commit_id":"bf81517a35e5a73dbf7074318f79a4c29888661a","user":{"login":"khusnetdinov","id":3524630,"avatar_url":"https://avatars.githubusercontent.com/u/3524630?","gravatar_id":"6fbb3c84587fd83dd3a6397944702719","url":"https://api.github.com/users/khusnetdinov","html_url":"https://github.com/khusnetdinov","followers_url":"https://api.github.com/users/khusnetdinov/followers","following_url":"https://api.github.com/users/khusnetdinov/following{/other_user}","gists_url":"https://api.github.com/users/khusnetdinov/gists{/gist_id}","starred_url":"https://api.github.com/users/khusnetdinov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/khusnetdinov/subscriptions","organizations_url":"https://api.github.com/users/khusnetdinov/orgs","repos_url":"https://api.github.com/users/khusnetdinov/repos","events_url":"https://api.github.com/users/khusnetdinov/events{/privacy}","received_events_url":"https://api.github.com/users/khusnetdinov/received_events","type":"User","site_admin":false},"body":"+","created_at":"2014-04-21T17:12:09Z","updated_at":"2014-04-21T17:12:09Z","html_url":"https://github.com/morsbox/rusrails/pull/101#discussion_r11815350","pull_request_url":"https://api.github.com/repos/morsbox/rusrails/pulls/101","_links":{"self":{"href":"https://api.github.com/repos/morsbox/rusrails/pulls/comments/11815350"},"html":{"href":"https://github.com/morsbox/rusrails/pull/101#discussion_r11815350"},"pull_request":{"href":"https://api.github.com/repos/morsbox/rusrails/pulls/101"}}}}