Hi, everyone, I make a shard called Jbuilder, you can use it to render json in your web project.
Example
require "jbuilder"
Jbuilder.new do |json|
json.null nil
json.code 200
json.msg "ok"
json.merge!({"code" => 201})
json.array! "array1", [1, 1.0, "1"]
json.array!("array2", [1, 2, 3, 4]) do |json, item|
json.code item
end
json.data do |json|
json.code 400
json.array! "array3", [1, 1.0, "1"]
end
json.set!("custom_field", %w[1 2])
end.to_json
Features
- Plain Crystal.
- Take json as view.
- Support layout.
- Support partial.
- Support cache by import other shard.
- Support Kemal, Amber, Lucky, Runcobo, etc.
An example using Runcobo
# Renders Jbuilder with "application/json" Content-Type.
#
# `src/views/layouts/application.jbuilder` must be present.
# `src/views/renders/example.jbuilder` must be present.
# ```
# class RenderJbuilder < BaseAction
# layout "application"
#
# call do
# render_jbuilder "renders/example", status_code: 200
# end
# end
# ```
macro render_jbuilder(filename, *, layout = "", status_code = 200, dir = "src/views/", layout_dir = "src/views/layouts/")
@context.response.content_type = "application/json"
@context.response.status_code = {{ status_code }}
{% layout_file = layout == "" ? LAYOUT : layout %}
{% if layout_file == "" %}
Jbuilder.embed("{{dir.id}}{{filename.id}}.jbuilder", @context.response.output)
{% else %}
Jbuilder.embed("{{dir.id}}{{filename.id}}.jbuilder", @context.response.output, "{{layout_dir.id}}{{layout_file.id}}.jbuilder")
{% end %}
@context
end