1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
require 'request_store'
require 'action_view'
require 'action_controller'
require 'multi_json'
require 'gon/base'
require 'gon/global'
require 'gon/watch'
require 'gon/request'
require 'gon/helpers'
require 'gon/escaper'
require 'gon/rabl'
require 'gon/jbuilder'
require 'gon/json_dumper'
# NOTE : ActionDispatch::Request#uuid appears only in Rails 3.2.1
unless ActionDispatch::Request.public_instance_methods.include?(:uuid)
require 'gon/compatibility/old_rails'
end
require 'gon/spec_helpers'
class Gon
class << self
def global
Gon::Global
end
def watch
Gon::Watch
end
def method_missing(method, *args, &block)
if method.to_s =~ /=$/
if public_method_name?(method)
raise 'You can\'t use Gon public methods for storing data'
end
if self == Gon && !current_gon
raise 'Assign request-specific gon variables only through `gon` helper, not through Gon constant'
end
set_variable(method.to_s.delete('='), args[0])
else
get_variable(method.to_s)
end
end
def get_variable(name)
current_gon.gon[name]
end
def set_variable(name, value)
current_gon.gon[name] = value
end
def push(data = {})
raise 'Object must have each_pair method' unless data.respond_to? :each_pair
data.each_pair do |name, value|
set_variable(name.to_s, value)
end
end
def all_variables
current_gon ? current_gon.gon : {}
end
def clear
current_gon.clear if current_gon
end
def rabl(*args)
data, options = Gon::Rabl.handler(args)
store_builder_data 'rabl', data, options
end
def jbuilder(*args)
ensure_template_handler_is_defined
data, options = Gon::Jbuilder.handler(args)
store_builder_data 'jbuilder', data, options
end
def inspect
'Gon'
end
private
def current_gon
RequestStore.store[:gon]
end
def store_builder_data(builder, data, options)
if options[:as]
set_variable(options[:as].to_s, data)
elsif data.is_a? Hash
data.each { |k, v| set_variable(k, v) }
else
set_variable(builder, data)
end
end
def public_method_name?(method)
public_methods.include?(
if RUBY_VERSION > '1.9'
method.to_s[0..-2].to_sym
else
method.to_s[0..-2]
end
)
end
# JbuilderTemplate will not be defined if jbuilder is required
# before gon. By loading jbuilder again, JbuilderTemplate will
# now be defined
def ensure_template_handler_is_defined
load 'jbuilder.rb' unless defined?(JbuilderTemplate)
end
end
end
|