grape-active_model_serializers/README.md
2013-08-11 00:01:26 +01:00

147 lines
3.6 KiB
Markdown

# Grape::ActiveModelSerializers
Use [active_model_serializers](https://github.com/rails-api/active_model_serializers) with [Grape](https://github.com/intridea/grape)!
[![Build Status](https://api.travis-ci.org/jrhe/grape-active_model_serializers.png)](http://travis-ci.org/jrhe/grape-active_model_serializers) [![Dependency Status](https://gemnasium.com/jrhe/grape-active_model_serializers.png)](https://gemnasium.com/jrhe/grape-active_model_serializers) [![Code Climate](https://codeclimate.com/github/jrhe/grape-active_model_serializers.png)](https://codeclimate.com/github/jrhe/grape-active_model_serializers)
## Installation
Add the `grape` and `grape-active_model_serializers` gems to Gemfile.
```ruby
gem 'grape'
gem 'grape-active_model_serializers'
```
And then execute:
bundle
## Usage
### Require grape-active_model_serializers
```ruby
# config.ru
require 'grape/active_model_serializers'
```
### Tell your API to use Grape::Formatter::ActiveModelSerializers
```ruby
class API < Grape::API
format :json
formatter :json, Grape::Formatter::ActiveModelSerializers
end
```
### Writing serializers
See [active_model_serializers](https://github.com/rails-api/active_model_serializers)
### Serializers are inferred by active_record model names
grape-active_model_serializers will search for serializers for the objects returned by your grape API.
```ruby
namespace :users do
get ":id" do
@user = User.find(params[:id])
end
end
```
In this case, as User objects are being returned, grape-active_model_serializers will look for a serializer named UserSerializer.
### Disabling serializer inferrence
You can turn off serializer inferrence.
```ruby
Grape::Formatter::ActiveModelSerializers.infer_serializers = false
```
### Manually specifying serializer options
Serializers can be specified at a route level by with the serializer option. A serializer can be specified by passing the the serializer class or the serializer name. The following are equivalent:
```ruby
get "/home", :serializer => HomeSerializer
...
```
```ruby
get "/home", :serializer => "home"
...
```
```ruby
get "/home", :serializer => :home
...
```
You can also set a serializer at the namespace level. This serializer can/will be overriden if a serilizer is also specified on the route.
```ruby
namespace 'foo', :serializer => :bar do
get "/" do
# will use "bar" serializer
end
get "/home", :serializer => :home do
# will use "home" serializer
end
end
```
Other standard options for `ActiveModel::Serializers` can be provided at either the namespace or route level with the same overriding behavior.
```ruby
get "/home", :root => 'world', :each_serializer => :fancy_home
...
```
### Example
```ruby
class User < ActiveRecord::Base
attr_accessor :first_name, :last_name, :password, :email
end
class UserSerializer < ActiveModel::Serializer
attributes :first_name, :last_name
end
class API < Grape::API
get("/home") do
User.new({first_name: 'JR', last_name: 'HE', email: 'contact@jrhe.co.uk'})
end
end
API.new.get "/home" # => '{:user=>{:first_name=>"JR", :last_name=>"HE"}}'
```
## Rspec
See "Writing Tests" in https://github.com/intridea/grape.
Enjoy :)
## Contributing
1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Added some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request
## Thanks to
The developers and maintainers of:
[active_model_serializers](https://github.com/rails-api/active_model_serializers)
[Grape](https://github.com/intridea/grape)!
Structured and based upon [Grape](https://github.com/LTe/grape-rabl).