As the name might have implied, Decoradar is a simple JSON serializer + decorator in Ruby.
Add this line to your application's Gemfile:
gem 'decoradar', '~> 0.1.1'
And then execute:
$ bundle
Decoradar is really simple and magic-free (zero monkey patch, zero auto coercion) and aims to bring ActiveModel::Serializer to Plain Ruby Object.
What will Decoradar brings you?
ActiveModel::Serializer
DSL style.- Magic free and explicit: there is no monkey patching or auto coercion.
- Isolated testing: it's just Ruby objects without Rails dependence so feel free to unit test it. (when I said unit-test I meant it)
class UserSerializer
include Decoradar
attributes :id, :username
attribute :full_name, as: :name
collection :posts, serializer: PostSerializer
end
UserSerializer.new(@user).as_json
# => { id: 1, username: "huynhquancam", name: "Cam Huynh", posts: [{...}] }
Let's say you want to tweak full_name
a bit.
class UserSerializer
include Decoradar
attributes :id, :name
attribute :full_name, as: :name
def full_name
model.full_name.capitalize
end
end
UserSerializer.new(@user).as_json
# => { id: 1, username: "huynhquancam", name: "CAM HUYNH" }
If we want the serialized hash to include an attribute as long as it exists, we can use include_if
option.
class UserSerializer
include Decoradar
attribute :id
attribute :username
attribute :is_admin, include_if: ->(model) { model.admin? }
end
UserSerializer.new(@mark).as_json
# => { id: 1, username: "zuck", is_admin: true }
UserSerializer.new(@trump).as_json
# => { id: 1, username: "realDonaldTrump" }
If you want to serialize a collection, there's NO AUTO-MAGIC COERCION, just uses .decorate_collection
.
UserSerializer.decorate_collection(@users).map(&:as_json)
- Fork this repo.
- Make your change and submit pull request (with specs please 😄)
Bug reports and pull requests are welcome on GitHub at https://github.com/qcam/decoradar. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.
The gem is available as open source under the terms of the MIT License.