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
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 }
- 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