Coder Social home page Coder Social logo

as_json_presentable's Introduction

AsJsonPresentable

This is a simple implementation of the presenter pattern for JSON presentation. When included in a class, it causes the class to attempt to delegate calls to #as_json to a presenter class.

Usage

For any model you want to make presentable, include the AsJsonPresentable module:

class Foo
  include AsJsonPresentable
end

TIP: For use with Rails and ActiveRecord, if all your models will be presentable, consider including an initializer that includes AsJsonPresentable in ActiveRecord::Base

e.g. config/initializers/active_record_as_json_presentable_patch.rb:

ActiveRecord::Base.include AsJsonPresentable

Including the AsJsonPresentable module attempts to use a presenter object on calls to #as_json if it is passed the :presenter_action option.

e.g. `object.as_json(presenter_action: :some_action)

By default, the presenter class is inferred to be named after the model class, but with the suffix of "Presenter".

e.g. If you have a model class called Foo, its presenter is assumed to be called FooPresenter

To override this, you can pass in a klass with the define_json_presenter_class class method.

e.g.

class Foo
  include AsJsonPresentable
  define_json_presenter_class SomeOtherPresenter
end

If #as_json is called without the :presenter_action options, or if the presenter class doesn't exist, this delegates to the original model class definition of #as_json

Your presenter class can technically be any PORO that responds to #as_json, but there is a handy base class, AsJsonPresentable::Presenter that you can extend.

In the base class implementation, #as_json looks for the :presenter_action option and attempts to call the #as_<presenter_action>_json method if it exists.

Here is a complete example:

class MyObjectPresenter < AsJsonPresentable::Presenter

  def as_special_json(options=nil)
    { special: true }
  end
end
class MyObject
  include AsJsonPresentable
end
obj = MyObject.new
obj.as_json(presenter_action: :special)
# => { special: true }

Contributing

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :D

as_json_presentable's People

Contributors

diminish7 avatar

Watchers

Joseph Christopher Lepis avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.