mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-23 22:36:50 +00:00
74 lines
2.5 KiB
Markdown
74 lines
2.5 KiB
Markdown
[Back to Guides](../README.md)
|
|
|
|
# How to serialize a Plain-Old Ruby Object (PORO)
|
|
|
|
When you are first getting started with ActiveModelSerializers, it may seem only `ActiveRecord::Base` objects can be serializable,
|
|
but pretty much any object can be serializable with ActiveModelSerializers.
|
|
Here is an example of a PORO that is serializable in most situations:
|
|
|
|
```ruby
|
|
# my_model.rb
|
|
class MyModel
|
|
alias :read_attribute_for_serialization :send
|
|
attr_accessor :id, :name, :level
|
|
|
|
def initialize(attributes)
|
|
@id = attributes[:id]
|
|
@name = attributes[:name]
|
|
@level = attributes[:level]
|
|
end
|
|
|
|
def self.model_name
|
|
@_model_name ||= ActiveModel::Name.new(self)
|
|
end
|
|
end
|
|
```
|
|
|
|
The [ActiveModel::Serializer::Lint::Tests](../../lib/active_model/serializer/lint.rb)
|
|
define and validate which methods ActiveModelSerializers expects to be implemented.
|
|
|
|
An implementation of the complete spec is included either for use or as reference:
|
|
[`ActiveModelSerializers::Model`](../../lib/active_model_serializers/model.rb).
|
|
You can use in production code that will make your PORO a lot cleaner.
|
|
|
|
The above code now becomes:
|
|
|
|
```ruby
|
|
# my_model.rb
|
|
class MyModel < ActiveModelSerializers::Model
|
|
attributes :id, :name, :level
|
|
end
|
|
```
|
|
|
|
The default serializer would be `MyModelSerializer`.
|
|
|
|
*IMPORTANT*: There is a surprising behavior (bug) in the current implementation of ActiveModelSerializers::Model that
|
|
prevents an accessor from modifying attributes on the instance. The fix for this bug
|
|
is a breaking change, so we have made an opt-in configuration.
|
|
|
|
New applications should set:
|
|
|
|
```ruby
|
|
ActiveModelSerializers::Model.derive_attributes_from_names_and_fix_accessors
|
|
```
|
|
|
|
Existing applications can use the fix *and* avoid breaking changes
|
|
by making a superclass for new models. For example:
|
|
|
|
```ruby
|
|
class SerializablePoro < ActiveModelSerializers::Model
|
|
derive_attributes_from_names_and_fix_accessors
|
|
end
|
|
```
|
|
|
|
So that `MyModel` above would inherit from `SerializablePoro`.
|
|
|
|
`derive_attributes_from_names_and_fix_accessors` prepends the `DeriveAttributesFromNamesAndFixAccessors`
|
|
module and does the following:
|
|
|
|
- `id` will *always* be in the attributes. (This is until we separate out the caching requirement for POROs.)
|
|
- Overwrites the `attributes` method to that it only returns declared attributes.
|
|
`attributes` will now be a frozen hash with indifferent access.
|
|
|
|
For more information, see [README: What does a 'serializable resource' look like?](../../README.md#what-does-a-serializable-resource-look-like).
|