Module: Roda::RodaPlugins::Json
- Defined in:
- lib/roda/plugins/json.rb
Overview
The json plugin allows match blocks to return arrays or hashes, and have those arrays or hashes be converted to json which is used as the response body. It also sets the response content type to application/json. So you can take code like:
r.root do
response['Content-Type'] = 'application/json'
[1, 2, 3].to_json
end
r.is "foo" do
response['Content-Type'] = 'application/json'
{'a'=>'b'}.to_json
end
and DRY it up:
plugin :json
r.root do
[1, 2, 3]
end
r.is "foo" do
{'a'=>'b'}
end
By default, only arrays and hashes are handled, but you can specifically set the allowed classes to json by adding using the :classes option when loading the plugin:
plugin :json, classes: [Array, Hash, Sequel::Model]
By default objects are serialized with to_json
, but you can pass in a custom serializer, which can be any object that responds to call(object).
plugin :json, serializer: proc{|o| o.to_json(root: true)}
If you need the request information during serialization, such as HTTP headers or query parameters, you can pass in the :include_request
option, which will pass in the request object as the second argument when calling the serializer.
plugin :json, include_request: true, serializer: proc{|o, request| ...}
The default content-type is ‘application/json’, but you can change that using the :content_type
option:
plugin :json, content_type: 'application/xml'
This plugin depends on the custom_block_results plugin, and therefore does not support treating String, FalseClass, or NilClass values as JSON.
Defined Under Namespace
Modules: ClassMethods, InstanceMethods, RequestMethods
Class Method Summary collapse
-
.configure(app, opts = OPTS) ⇒ Object
Set the classes to automatically convert to JSON, and the serializer to use.
Class Method Details
.configure(app, opts = OPTS) ⇒ Object
Set the classes to automatically convert to JSON, and the serializer to use.
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/roda/plugins/json.rb', line 60 def self.configure(app, opts=OPTS) app.plugin :custom_block_results classes = opts[:classes] || [Array, Hash] app.opts[:json_result_classes] ||= [] app.opts[:json_result_classes] += classes classes = app.opts[:json_result_classes] classes.uniq! classes.freeze classes.each do |klass| app.opts[:custom_block_results][klass] = :handle_json_block_result end app.opts[:json_result_serializer] = opts[:serializer] || app.opts[:json_result_serializer] || app.opts[:json_serializer] || :to_json.to_proc app.opts[:json_result_include_request] = opts[:include_request] if opts.has_key?(:include_request) app.opts[:json_result_content_type] = opts[:content_type] || 'application/json'.freeze end |