render_json

Aquí ya hemos hablado alguna que otra vez del la generación de contenidos dinámicos usando técnicas basadas en la etiqueta script. En esa ocasión comentábamos cómo podemos hacer que nuestra aplicación Rails devuelva las instrucciones precisas para empotrar contenido generado por nosotros en la página HTML que invoque a nuestro script, y vimos lo sencillo que es hacerlo con Rails.

Sin embargo, este enfoque era algo limitado, porque lo único que podíamos hacer es precisamente insertar insertar texto en una páquina web. Por ejemplo, no podríamos hacer manipulaciones del DOM de la página para mostrar ese contenido en otro lugar ¡porque nuestra aplicación Rails no tiene ni idea de la estructura de la página que está invocandola! Por la misma razón, tampoco podríamos masajear los datos devueltos de la forma en que le conviene a quien nos están invocando.

Hasta ahora. Rails incorpora un nuevo método a la familia de los “render”: render_json (de momento sólo en edge rails)

Este método simplemente devuelve un objeto Ruby en formato JSON del cual somos firmes defensores (“be JSON, my friend”) y además generará el código Javascript necesario para invocar una función Javascript que definida en la página HTML, y que podemos o no haber proporcionado nosotros) que, esta sí, puede hacer con los datos lo que le parezca.

Por tanto, en lugar de insertar caracteres de manera más o menos fija en una página web, ahora estamos definiendo una suerte de API basado en JSON. Un ejemplo de API construido de esta manera es Google API

Supongamos que tenemos una aplicación que devuelve la clasificación de los clubes de Primera División de La Liga y queremos que cualquiera en su página web pueda insertar esta clasificación. Nada más fácil, porque podemos convertir cualquier estructura Ruby en JSON usando el método to_json:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class TestController < ApplicationController
        
def script
        render_json(myData.to_json, params[:callback])
end

private

def myData
        [[1, "Sevilla"], [2,"Barcelona"], [3, "Real Madrid"],
        [4, "Atlético"], [5, "Zaragoza"], [6, "Valencia"],
        [7, "Getafe"], [8, "Recreativo"], [9, "Villareal"],
        [10, "Osasuna"], [11, "Celta"], [12, "Espanyool"],
        [13, "Racing"], [14, "Mallorca"], [15, "Deportivo"], 
        [16, "Levante"], [17, "Athletic"], [18, "Betis"],
        [19, "R.Sociedad"], [20, "Gimnastic"]]
end

end

Con esto, en cualquier página web podríamos insertar las siguientes etiquetas:


<script src="http://localhost:3000/test/script?callback=myCallback”></script>

Y el código Javascript que devolverá nuestra aplicación será, consecuentemente:

myCallback([[1, "Sevilla"], [2, "Barcelona"], [3, "Real Madrid"], [4, "Atlético"], [5, "Zaragoza"], [6, "Valencia"], [7, "Getafe"], [8, "Recreativo"], [9, "Villareal"], (...)])

Con myCallback la web puede hacer exactmente lo que le parezca con nuestros datos, puesto que le estamos pasando una estructura JSON, perfectamente válida en Javascript. Por ejemplo podríamos ordenar la clasificación por orden alfabético, en lugar de por puesto en la tabla… el límite es tu imaginación (lo siento, no he podido resistirme ;-)

blog comments powered by Disqus