From 099047eebd2c23cef47532b71b801eba184e0cef Mon Sep 17 00:00:00 2001 From: Ivan Vanderbyl Date: Sat, 14 Apr 2012 17:03:37 +1000 Subject: [PATCH] Added Rabl::Renderer, a generic rendering class for rendering outside of frameworks --- lib/rabl/renderer.rb | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/lib/rabl/renderer.rb b/lib/rabl/renderer.rb index b32afa89..896af384 100644 --- a/lib/rabl/renderer.rb +++ b/lib/rabl/renderer.rb @@ -1,25 +1,37 @@ module Rabl - class Renderer < Engine + class Renderer - attr_reader :file, :object, :options - def initialize(file, object, options = {}) - options = {:format => :json}.update(options) - @file, @object, @options = file, object, options + attr_reader :object, :options + def initialize(source, object = nil, options = {}) + options = { + :format => :json, + :scope => self, + :view_path => [] + }.update(options) + @options = options - view_path = options.delete(:view_path) - source, location = engine.fetch_source(file, :view_path => view_path) - engine.source = source + @object = object + + engine.source = self.process_source(source) end - def render - set_instance_variable(object) - engine.render(self, {}) + def render(scope = nil) + scope = scope ? scope : options.delete(:scope) || self + set_instance_variable(object) if scope == self + engine.render(scope, options.fetch(:locals, {})) end protected def engine - @engine ||= Engine.new(nil, options) + @engine ||= Rabl::Engine.new(nil, options) + end + + def process_source(source) + unless source.is_a?(String) && source =~ /\n/ + source, _ = engine.fetch_source(source, {:view_path => options[:view_path]}) + end + return source end def set_instance_variable(object) @@ -27,5 +39,11 @@ def set_instance_variable(object) instance_variable_set(:"@#{name}", object) end + def model_name(object) + item = object.is_a?(Array) ? object.first : object + name = item.class.name.underscore + object.is_a?(Array) ? name.pluralize : name + end + end end