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.
For any model you want to make presentable, include the AsJsonPresentable module:
class Foo
include AsJsonPresentable
endTIP: 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 AsJsonPresentableIncluding 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
endIf #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
endclass MyObject
include AsJsonPresentable
endobj = MyObject.new
obj.as_json(presenter_action: :special)
# => { special: true }- Fork it!
- Create your feature branch: git checkout -b my-new-feature
- Commit your changes: git commit -am 'Add some feature'
- Push to the branch: git push origin my-new-feature
- Submit a pull request :D