active_model_serializers/docs/howto/outside_controller_use.md
Alex Popov d39dd04c11 Update SerializableResource documentation (#1977)
Mention that ActiveModelSerializers::SerializableResource.new can be used for
single resource as well as for collections
2016-11-17 13:57:07 +01:00

66 lines
2.0 KiB
Markdown

[Back to Guides](../README.md)
## Using ActiveModelSerializers Outside Of A Controller
### Serializing a resource
In ActiveModelSerializers versions 0.10 or later, serializing resources outside of the controller context is fairly simple:
```ruby
# Create our resource
post = Post.create(title: "Sample post", body: "I love Active Model Serializers!")
# Optional options parameters
options = {}
# Create a serializable resource instance
serializable_resource = ActiveModelSerializers::SerializableResource.new(post, options)
# Convert your resource into json
model_json = serializable_resource.as_json
```
The object that is passed to `ActiveModelSerializers::SerializableResource.new` can be a single resource or a collection.
### Looking up the Serializer for a Resource
If you want to retrieve the serializer class for a specific resource, you can do the following:
```ruby
# Create our resource
post = Post.create(title: "Another Example", body: "So much fun.")
# Optional options parameters
options = {}
# Retrieve the default serializer for posts
serializer = ActiveModel::Serializer.serializer_for(post, options)
```
You could also retrieve the serializer via:
```ruby
ActiveModelSerializers::SerializableResource.new(post, options).serializer
```
Both approaches will return the serializer class that will be used for the resource.
Additionally, you could retrieve the serializer instance for the resource via:
```ruby
ActiveModelSerializers::SerializableResource.new(post, options).serializer_instance
```
## Serializing before controller render
At times, you might want to use a serializer without rendering it to the view. For those cases, you can create an instance of `ActiveModelSerializers::SerializableResource` with
the resource you want to be serialized and call `.as_json`.
```ruby
def create
message = current_user.messages.create!(message_params)
message_json = ActiveModelSerializers::SerializableResource.new(message).as_json
MessageCreationWorker.perform(message_json)
head 204
end
```