
Sistema de plantillas Ruby para generar APIs JSON y XML, con una corrección para CVE-2014-4671. Admite parciales, herencia y nodos personalizados para una construcción flexible de respuestas API.
RABL (Ruby API Builder Language) es un sistema de plantillas Ruby para Rails y Padrino que genera JSON, XML, MessagePack, PList y BSON. Al usar el método 'to_json' de ActiveRecord, me encuentro deseando una solución más expresiva y potente para generar APIs. Esto es especialmente cierto cuando la representación JSON es compleja o no coincide exactamente con el esquema definido en la base de datos.
En particular, quiero fácilmente:
Cualquiera que haya probado el método 'to_json' usado en ActiveRecord para generar una respuesta JSON ha sentido el dolor de este enfoque restrictivo. RABL es un sistema de plantillas general creado para resolver estos problemas abordando la generación de respuestas API de una manera completamente nueva.
En esencia, RABL se trata de adherirse a los principios MVC delegando las representaciones de datos de la API a la capa de vista de tu aplicación. Para un desglose de conceptos erróneos comunes sobre RABL, consulta nuestra guía para entender RABL que puede ayudar a aclarar cualquier confusión sobre este proyecto.
v0.8.0 (publicado el 14 de febrero de 2013) elimina la dependencia de multi_json y se basa en Oj (o JSON) como analizador JSON. Simplifica el código, elimina una dependencia pero es posible que desees eliminar cualquier referencia a MultiJson.
v0.6.14 (publicado el 28 de junio de 2012) requiere el uso de render_views con RSpec para probar las plantillas. De lo contrario, el controlador simplemente pasará el comando render como lo hace con las plantillas ERB.
Instala RABL como una gema:``` gem install rabl
o añádelo a tu Gemfile:```ruby
# Gemfile
gem 'rabl'
# Also add either `oj` or `yajl-ruby` as the JSON parser
gem 'oj'
y ejecuta bundle install para instalar la dependencia.
Si estás usando Rails 2.3.8 (y superiores), Rails 3.X o Padrino, RABL funciona sin configuración.
Importante: Con Padrino, asegúrate de que la gema rabl esté listada después de la gema padrino en tu Gemfile, de lo contrario Rabl no se registrará correctamente como un motor de plantillas.
Con Sinatra, o cualquier otro framework basado en tilt, simplemente registra:```ruby Rabl.register!
y RABL se inicializará y estará listo para usar. Para su uso con Sinatra, consulta la guía de [Uso de Sinatra](https://github.com/nesquena/rabl/wiki/Setup-for-Sinatra).
## Resumen ##
Puedes usar RABL para generar APIs basadas en JSON y XML desde cualquier objeto de Ruby. Con RABL, los datos generalmente se derivan principalmente de modelos (independientes del ORM) y la representación de la salida de la API se describe dentro de una plantilla de vista utilizando un DSL simple de Ruby. Esto te permite mantener tus datos separados del JSON o XML que deseas generar.
Una vez que hayas instalado RABL (explicado anteriormente), puedes construir una plantilla de vista de RABL y luego renderizarla desde tus aplicaciones Sinatra, Padrino o Rails desde el controlador (o ruta) muy fácilmente. Usando [Padrino](http://padrinorb.com) como ejemplo, suponiendo que tienes un modelo `Post` lleno de publicaciones de blog, puedes renderizar una representación de la API (tanto JSON como XML) creando una ruta:```ruby
# app/app.rb
get "/posts", :provides => [:json, :xml] do
@user = current_user
@posts = Post.order("id DESC")
render "posts/index"
end
Luego podemos crear la siguiente plantilla RABL para expresar la salida de la API de @posts:```ruby
collection @posts attributes :id, :title, :subject child(:user) { attributes :full_name } node(:read) { |post| post.read_by?(@user) }
Lo cual generaría el siguiente JSON o XML al visitar `http://localhost:3000/posts.json````js
[{ "post" :
{
"id" : 5, title: "...", subject: "...",
"user" : { full_name : "..." },
"read" : true
}
}]
Eso es una visión general básica, pero hay mucho más que ver, como partials, herencia, nodos personalizados, etc. Lee los detalles completos de RABL a continuación.
RABL está diseñado para requerir poca o ninguna configuración para funcionar. Este es el caso en la mayoría de los escenarios, pero dependiendo de tus necesidades, es posible que desees establecer las siguientes configuraciones globales en tu aplicación (este bloque es completamente opcional):```ruby
require 'rabl' Rabl.configure do |config|
end
Cada opción especifica un comportamiento relacionado con la salida de RABL. Si `include_json_root` está deshabilitado, se elimina el
nodo raíz para cada objeto raíz en la salida, y `enable_json_callbacks` habilita el soporte para la salida de estilo 'jsonp' callback
si la solicitud entrante tiene un parámetro 'callback'.
Si `include_child_root` se establece en `false`, los objetos hijo en la respuesta no incluirán
un nodo raíz por defecto. Esto permite afinar aún más la estructura de respuesta deseada.
Si `cache_engine` está configurado, debe asignarlo a una clase con un método `fetch`. Consulte el [motor predeterminado](https://github.com/nesquena/rabl/blob/master/lib/rabl/cache_engine.rb) para ver un ejemplo.
Si `perform_caching` se establece en `true`, entonces realizará el almacenamiento en caché. Puede
ignorar esta opción si está usando Rails, es equivalente a
`config.action_controller.perform_caching` de Rails.
Si `cache_sources` se establece en `true`, las búsquedas de plantillas se almacenarán en caché para mejorar el rendimiento.
La caché se puede restablecer manualmente ejecutando `Rabl.reset_source_cache!` dentro de su aplicación.
Si `cache_all_output` se establece en `true`, cada plantilla, incluyendo cada plantilla individual utilizada como parte de una colección, se almacenará en caché por separado.
Además, cualquier cosa dentro de child, glue y partial también se almacenará en caché por separado.
Para almacenar en caché solo una sola plantilla, consulte la sección titulada 'Caching' más abajo.