Siempre me ha encantado en Meneame.net o Digg.com aquella página que puedes ver en tiempo real los movimientos que hay en la web. En una llamada Fisgona y en el otro Digg Spy.
Me he quedado soprendido de lo fácil que es en Ruby on Rails crear una aplicación parecida. A continuación añado el código más relevante para crearla.
Explicado en pocas palabras vamos a crear una página que tendrá una <div> llamada fisgon. Le añadiremos una función que actualizará cada 30 segundos el contenido de esta región. Para ello lo único que haremos será leer las últimas 30 entradas y luego construir el código html que enviaremos a la página via AJAX. También veréis que la primera carga la tenemos que hacer vía normal utilizando un controlador normal o sino nos aparecería la región en blanco inicialmente.
La aplicación ejemplo crea un log en un modelo llamado Control:
1.- Crear un modelo llamado Control
2.- Crear una migración para crear la tabla:
def self.up
create_table :controls do |t|
t.column :user, :string, :null => false
t.column :ip, :string
t.column :agent, :string
t.column :other, :string
t.column :user_id, :integer, :default =>0
t.column :desc, :string
t.column :level, :integer, :default => 0
t.column :created_at , :datetime, :null => false
end
end
def self.down
drop_table :controls
end
3.- En el controlador que queramos utilizar añadir la siguiente función:
def fisgon
@control=Control.find(:all,:limit=>30,:order=> ‘created_at DESC’)
end
Tendremos que añadir la ruta necesaria en nuestro fichero routes.rb para asegurar que enrute.
4.- Crear el fichero fisgon.rhml
<html>
………
<%= periodically_call_remote(
:update => ‘fisgon’,
:url => { :action => ‘get_fisgon’ },
:success => “$(’fisgon’).visualEffect(’highlight’)”,
:frecuency => 30) %>
<div id=”fisgon”>
<%=Time.now.strftime(”%d/%m/%y %H:%M:%S”).to_s+’ > ‘+List.sum( :nused).to_s+’ times used lists.’%><br />
<table class=”list” cellspacing=”0″ cellpadding=”0″>
<tr>
<th class=”small_col”>Date</th>
<th>Event</th>
<th>ip</th>
<th>Agent</th>
<th>Other</th>
</tr>
<%@control.each do |control| -%>
<tr > <td class=”first_col”><%= control.created_at.strftime(”%d/%m/%y %H:%M:%S”) -%></td><td class=”first_col”><%= control.desc -%></td><td class=”first_col”><%= control.ip -%></td><td class=”first_col”><%= control.agent -%></td><td class=”first_col”><%= control.other -%></td></tr>
<% end -%>
</table>
</div>
……..
</html>
Aquí a través de periodically_call_remote hacemos una llamada cada 30 segundos para que ejecute una función remota que actualiza el div id=”fisgon”.
5.-Es importante que nuestra plantilla tenga incluida la siguiente línea
<%= javascript_include_tag :defaults %>
para que cargue la librerias javascript que permitan el uso de AJAX.
6.- Añadimos en el controlador application.rb la siguiente función:
def get_fisgon
@html=Time.now.strftime(”%d/%m/%y %H:%M:%S”).to_s+’ > ‘+List.sum( :nused).to_s+’ times used lists.<br /><table class=”list” cellspacing=”0″ cellpadding=”0″><tr><th class=”small_col”>Date</th><th>Event</th><th>ip</th><th>Agent</th><th>Other</th></tr>’
@control=Control.find(:all,:limit=>30,:order=> ‘created_at DESC’)
@control.each do |control|
@htmli=’<tr ><td class=”first_col”>’+control.created_at.strftime(”%d/%m/%y %H:%M:%S”).to_s+’</td><td class=”first_col”>’+control.desc+’</td><td class=”first_col”>’+( control.ip.nil? ? ‘ ‘ : control.ip)+’</td><td class=”first_col”>’+(control.agent.nil? ? ‘ ‘ : control.agent)+’</td><td class=”first_col”>’+(control.other.nil? ? ‘ ‘: control.other)+’</td>’
@html=@html+@htmli
end
@html=@html+’</table>’
render :text=>@html
end
7.- Añadimos otra función en el controlador para que guarde la información en el modelo control.
def logaction( desc, level)
user=’Annonymous’
userid=0
ip = request.remote_ip
agent = request.user_agent
renv = request.env[’HTTP_REFERER’]
other = renv
@control= Control.new(:ip => ip,:created_at => Time.now, :user=> user, :user_id => userid ,:desc => desc, :level => level, :agent => agent, :other => other)
@control.save
end
En esta función guardamos toda la información del Request y la escribimos en el modelo Control.
8.- Por último sólo tenemos que escoger en que momento queremos guardar la información y hacer una llamada a logaction( ’se ha visitado tal página’,1) y guardará un registro en Control.
Como podréis ver es un fisgon muy rudimentario pero a su vez sencillo de desarrollar en Ruby on Rails.
Si alguien tiene alguna sugerencia o mejora que no dude en compartirla.