List of supported rendering formats
Constructs a new ejs engine based on given vars, handler and declarations ::new(“…source…”, { :format => “xml”, :root => true, :view_path => “/path/to/views” })
# File lib/rabl/engine.rb, line 10 def initialize(source, options={}) @_source = source @_options = options @_view_path = options[:view_path] end
Indicates an attribute or method should be included in the json output attribute :foo, :as => “bar” attribute :foo => :bar
# File lib/rabl/engine.rb, line 152 def attribute(*args) if args.first.is_a?(Hash) # :foo => :bar, :bar => :baz args.first.each_pair { |k,v| self.attribute(k, :as => v) } else # array of attributes i.e :foo, :bar, :baz options = args.extract_options! args.each { |name| @_options[:attributes][name] = options[:as] || name } end end
Sets the cache key to be used by ActiveSupport::Cache.expand_cache_key cache @user # calls @user.cache_key cache [‘rabl’, @user] # calls @user.cache_key and prefixes with rabl/ cache ‘user’ # explicit key of ‘user’ cache # uses the current item within a collection cache ‘user’, expires_in: 1.hour options is passed through to the cache store
# File lib/rabl/engine.rb, line 144 def cache(key = nil, options = nil) key ||= @_data # if called but missing, use object @_cache = [key, options] end
Creates a child node that is included in json output child(@user) { attribute :full_name }
# File lib/rabl/engine.rb, line 172 def child(data, options={}, &block) @_options[:child].push({ :data => data, :options => options, :block => block }) end
Sets the object as a collection casted to a simple array collection @users collection @users => :people collection @users, :root => :person collection @users, :object_root => :person
# File lib/rabl/engine.rb, line 130 def collection(data, options={}) @_collection_name = options[:root] if options[:root] @_collection_name ||= data.values.first if data.respond_to?(:each_pair) @_object_root_name = options[:object_root] if options.has_key?(:object_root) self.object(data_object(data).to_a) end
Extends an existing rabl template with additional attributes in the block extends(“users/show”, :object => @user) { attribute :full_name }
# File lib/rabl/engine.rb, line 184 def extends(file, options={}, &block) extend_ops = options.merge(:view_path => options.fetch(:view_path, @_options[:view_path])) @_options[:extends].push({ :file => file, :options => extend_ops, :block => block }) end
Glues data from a child node to the json_output glue(@user) { attribute :full_name => :user_full_name }
# File lib/rabl/engine.rb, line 178 def glue(data, &block) @_options[:glue].push({ :data => data, :block => block }) end
Includes a helper module with a RABL template helper ExampleHelper
# File lib/rabl/engine.rb, line 191 def helper(*klazzes) klazzes.each { |klazz| self.class.__send__(:include, klazz) } end
Creates an arbitrary node that is included in the json output. node(:foo) { “bar” } node(:foo, :if => lambda { … }) { “bar” }
# File lib/rabl/engine.rb, line 165 def node(name = nil, options={}, &block) @_options[:node].push({ :name => name, :options => options, :block => block }) end
Sets the object to be used as the data source for this template object(@user) object @user => :person object @users
# File lib/rabl/engine.rb, line 114 def object(data) @_data = data unless @_locals[:object] end
Renders the representation based on source, object, scope and locals ::new(“…source…”, { :format => “xml” }).render(scope, { :foo => “bar”, :object => @user })
# File lib/rabl/engine.rb, line 22 def render(scope, locals, &block) reset_options! @_locals, @_scope = locals, scope self.copy_instance_variables_from(@_scope, [:@assigns, :@helpers]) @_options[:scope] = @_scope @_options[:format] ||= self.request_format @_data = locals[:object] || self.default_object if @_options[:source_location] instance_eval(@_source, @_options[:source_location]) if @_source.present? else # without source location instance_eval(@_source) if @_source.present? end instance_eval(&block) if block_given? cache_results { self.send("to_" + @_options[:format].to_s) } end
Returns the current object that is the topic of this template Can be the collection or the object depending on topic assigned #root_object => @user
# File lib/rabl/engine.rb, line 121 def root_object @_data end
# File lib/rabl/engine.rb, line 16 def source=(string) @_source = string end
Returns a bson representation of the data object #to_bson(:root => true)
# File lib/rabl/engine.rb, line 96 def to_bson(options={}) include_root = Rabl.configuration.include_bson_root include_child_root = Rabl.configuration.include_child_root options = options.reverse_merge(:root => include_root, :child_root => include_child_root) result = if collection_root_name { collection_root_name => to_hash(options) } elsif is_collection?(@_data) && @_data.is_a?(Array) { data_name(@_data) => to_hash(options) } else to_hash(options) end Rabl.configuration.bson_engine.serialize(result).to_s end
Returns a hash representation of the data object #to_hash(:root => true, :child_root => true)
# File lib/rabl/engine.rb, line 40 def to_hash(options={}) options = @_options.merge(options) data = data_object(@_data) builder = Rabl::Builder.new(options) options[:root_name] = determine_object_root(@_data, options[:root]) if is_object?(data) || !data # object @user builder.build(data, options) elsif is_collection?(data) # collection @users data.map { |object| builder.build(object, options) } end end
Returns a json representation of the data object #to_json(:root => true)
# File lib/rabl/engine.rb, line 55 def to_json(options={}) include_root = Rabl.configuration.include_json_root include_child_root = Rabl.configuration.include_child_root options = options.reverse_merge(:root => include_root, :child_root => include_child_root) result = collection_root_name ? { collection_root_name => to_hash(options) } : to_hash(options) format_json(result) end
Returns a msgpack representation of the data object #to_msgpack(:root => true)
# File lib/rabl/engine.rb, line 65 def to_msgpack(options={}) include_root = Rabl.configuration.include_msgpack_root include_child_root = Rabl.configuration.include_child_root options = options.reverse_merge(:root => include_root, :child_root => include_child_root) result = collection_root_name ? { collection_root_name => to_hash(options) } : to_hash(options) Rabl.configuration.msgpack_engine.pack result end
Returns a plist representation of the data object #to_plist(:root => true)
# File lib/rabl/engine.rb, line 76 def to_plist(options={}) include_root = Rabl.configuration.include_plist_root include_child_root = Rabl.configuration.include_child_root options = options.reverse_merge(:root => include_root, :child_root => include_child_root) result = defined?(@_collection_name) ? { @_collection_name => to_hash(options) } : to_hash(options) Rabl.configuration.plist_engine.dump(result) end
Returns an xml representation of the data object #to_xml(:root => true)
# File lib/rabl/engine.rb, line 86 def to_xml(options={}) include_root = Rabl.configuration.include_xml_root include_child_root = include_root && Rabl.configuration.include_child_root options = options.reverse_merge(:root => include_root, :child_root => include_child_root) xml_options = Rabl.configuration.default_xml_options.merge(:root => data_name(@_data)) to_hash(options).to_xml(xml_options) end
Returns a guess at the default object for this template #default_object => @user
# File lib/rabl/engine.rb, line 200 def default_object if context_scope.respond_to?(:controller) controller_name = context_scope.controller.controller_name stripped_name = controller_name.split(%r{::|\/}).last instance_variable_get("@#{stripped_name}") end end
Returns data as json embraced with callback when detected #format_json({ :foo => “bar” }) => “test({ foo : ‘bar’ })” #format_json(“{ foo : ”bar“ }”) => “test({ foo : ‘bar’ })”
# File lib/rabl/engine.rb, line 227 def format_json(json_output) json_engine = Rabl.configuration.json_engine json_method = json_engine.respond_to?(:dump) ? 'dump' : 'encode' # multi_json compatibility TODO json_output = json_engine.send(json_method, json_output) unless json_output.is_a?(String) use_callback = Rabl.configuration.enable_json_callbacks && request_params[:callback].present? use_callback ? "#{request_params[:callback]}(#{json_output})" : json_output end
Supports calling helpers defined for the template scope using #method_missing hook
# File lib/rabl/engine.rb, line 241 def method_missing(name, *args, &block) context_scope.respond_to?(name, true) ? context_scope.__send__(name, *args, &block) : super end
Returns a guess at the format in this scope #request_format => “xml”
# File lib/rabl/engine.rb, line 210 def request_format format = self.request_params.has_key?(:format) ? context_scope.params[:format] : nil if request = context_scope.respond_to?(:request) && context_scope.request format ||= request.format.to_sym.to_s if request.respond_to?(:format) end format && self.respond_to?("to_#{format}") ? format : "json" end
Returns the request parameters if available in the scope #request_params => { :foo => “bar” }
# File lib/rabl/engine.rb, line 220 def request_params context_scope.respond_to?(:params) ? context_scope.params : {} end
Augments respond to supporting scope methods
# File lib/rabl/engine.rb, line 236 def respond_to?(name, include_private=false) context_scope.respond_to?(name, include_private) ? true : super end