Skip to content

Instantly share code, notes, and snippets.

@doxavore
Forked from ahoward/presenter.rb
Created April 19, 2012 16:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save doxavore/2421978 to your computer and use it in GitHub Desktop.
Save doxavore/2421978 to your computer and use it in GitHub Desktop.
worlds simplest presenter pattern. drop in replacement for ActiveRecord/Mongoid models in your controller
# the worlds lightest weight presenter pattern. to use simply
#
# file app/presenters/post_presenter.rb
#
# PostPresenter =
# Presenter.for(Post) do
# validates_presence_of :custom_field_for_this_form
#
# end
#
# works with ActiveRecord and Mongoid models
#
begin
require 'rails_helper'
rescue LoadError
end
class Presenter
def Presenter.for(model, &block)
Class.new(model).class_eval do
presenter = self
singleton_class = class << presenter; self; end
singleton_class.module_eval do
define_method(:model_name){ model.model_name }
end
if model.respond_to?(:table_name)
presenter.set_table_name(model.table_name)
end
if model.respond_to?(:base_class)
singleton_class.send(:define_method, :base_class){ model.base_class }
end
if model.respond_to?(:collection_name)
presenter.collection_name = model.collection_name
end
if model.respond_to?(:hereditary?)
singleton_class.send(:define_method, :hereditary?){ false }
define_method(:hereditary?){ self.class.hereditary? }
end
define_method(:helper){ @helper ||= Helper.new } if defined?(Helper)
presenter.class_eval(&block) if block
presenter
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment