Skip to content

Outside Controller Documentation Use #1083

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 10 commits into from
1 change: 1 addition & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ This is the documentation of AMS, it's focused on the **0.10.x version.**

- [How to add root key](howto/add_root_key.md)
- [How to add pagination links](howto/add_pagination_links.md)
- [Use AMS Outside A Controller](howto/outside_controller_use.md)

## Getting Help

Expand Down
42 changes: 42 additions & 0 deletions docs/howto/outside_controller_use.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
## Using AMS Outside Of A Controller

### Serializing a resource

In AMS 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!")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO (in future PRs):

  • example resource doesn't need to be persisted or even an ActiveRecord object
    • unless your unpersisted resources needs an attribute only available in the db
    • unless your 'poro' needs complicated associations
  • Show ActiveModel::Serializer::Lint::Tests and usage

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(thumbsup)


# Optional options parameters
options = {}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO (in future PRs):

  • link to description of options and how they are used ( as serializer_options, adapter_options, and renderer options)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed.


# Create a serializable resource instance
serializable_resource = ActiveModel::SerializableResource.new(post, options)

# Convert your resource into json
model_json = serializable_resource.as_json
```

### Retrieving a Resource's Active Model Serializer

If you want to retrieve a serializer for a specific resource, you can do the following:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the use case is, right now, for getting a serializer class or instance. The only thing I can think of is to test that the serializer works as expected, which still requires and adapter...

If you can think of one, I think it would be good to add

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Besides that, I'm 💯 LGTM

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not really sure. I mainly added this because it was one of the requests of the initial issue. Still might be worth having for the moment.


```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)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great job here! you could also call ActiveModel::SerializableResource.serialize(post, options).serializer if you already have that, though it'll either give you ArraySerializer if the resource responds to :each, else the same as ActiveModel::Serializer.serializer_for(post, options)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! I'll be sure to include that option as well!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just to clarify, this is the serializer class i.e. serializer == PostSerializer, not the serializer instance (same below).

ref:

def serializer_instance
@serializer_instance ||= serializer.new(resource, serializer_opts)
end
# Get serializer either explicitly :serializer or implicitly from resource
# Remove :serializer key from serializer_opts
# Replace :serializer key with :each_serializer if present
def serializer
@serializer ||=
begin
@serializer = serializer_opts.delete(:serializer)
@serializer ||= ActiveModel::Serializer.serializer_for(resource)
if serializer_opts.key?(:each_serializer)
serializer_opts[:serializer] = serializer_opts.delete(:each_serializer)
end
@serializer
end
end
alias_method :serializer_class, :serializer

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, the comment "Create the serializer" might be misleading. What about "Retrieve the default serializer for Posts"?

```

You could also retrieve the serializer via:

```ruby
ActiveModel::SerializableResource.new(post, options).serializer
```

Both approaches will return an instance, if any, of the resource's serializer.