Posted by mauro on May 6, 2009 in
Rails
Si queremos tener en el nuevo ubuntu 9.04 el mismo sistema de notificaciones de MAC con Growl, podemos hacerlo con los siguientes pasos
1)
sudo apt-get install libnotify-bin
2)
sudo gem install carlosbrando-autotest-notification --source=http://gems.github.com
3)
Comandos disponibles
$ an-install
Para desinstalar las notificaciones
$ an-uninstall
Version hablada
(sudo apt-get install espeak)
$ an-install --doom --speaking
Notificar de los pendientes
$ an-install --pending
Posted by mauro on Apr 29, 2009 in
Rails
Esta es la configuracion global que suelo usar para mis proyectos rails con git en ~/$HOME/.gitconfig
El mas interesante es
git up
que seria equivalente a
git fetch && git rebase origin/master
Posted by mauro on Mar 31, 2009 in
Rails
Sphinx es un excelente motor de busquedas que nos permite hacer consultas ultra optimizadas en nuestras applicaciones.
Gracias al plugin Thinking sphinx podemos portar este motor a nuestra aplicacion rails. A continuacion los pasos para configurar nuestra aplicacion con thinking sphinx
Instalar Sphinx
Si van a usar como motor de base de datos mysql asegurarse de tener instalado las librerias de mysql
sudo apt-get install libmysqlclient15-dev
Bajamos la source desde http://sphinxsearch.com/ version recomendada (0.9.8.1)
wget http://sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz
Descomprimir el codigo
tar -xvzf sphinx-0.9.8.1.tar.gz
Compilamos
cd sphinx-0.9.8.
sphinx-0.9.8# ./configure
sphinx-0.9.8# make
sphinx-0.9.8# make install
Instalamos thinking sphinx
./script/plugin install git://github.com/freelancing-god/thinking-sphinx.git
Configurando thinking sphinx
En el modelo
En el controller
Si tenemos varias aplicaciones utilizando sphinx puede ser que tengamos problemas debido que sphinx corre como demonio utilizando el puerto 3112 por defecto.
Podriamos cambiar esto editando la opcion “port” dentro del archivo config/sphinx.conf. Tambien hay que decirle a thinking sphinx en que puerto debe buscar a sphinx, para esto creamos el siguiente archivo
Iniciando thinking sphinx
En thinking sphinx tenemos disponibles las siguientes tareas
rake thinking_sphinx:configure # Generate the Sphinx configuration file using Thinking Sphinx’s settings
rake thinking_sphinx:delayed_delta # Process stored delta index requests
rake thinking_sphinx:index # Index data for Sphinx using Thinking Sphinx’s settings
rake thinking_sphinx:restart # Restart Sphinx
rake thinking_sphinx:running_start # Stop if running, then start a Sphinx searchd daemon using Thinking Sphinx’s settings
rake thinking_sphinx:start # Start a Sphinx searchd daemon using Thinking Sphinx’s settings
rake thinking_sphinx:stop # Stop Sphinx using Thinking Sphinx’s settings
Posted by mauro on Mar 18, 2009 in
Rails
El plugin will_paginate es sin duda el mas utilizado en rails para la paginación de resultados. Se encuentra disponible tanto en version Plugin como en Gema.
Vista estandar del helper
El plugin incluye un helper, sorpresivamente llamado will_paginate
que hace facil la paginación para tus vistas, un ejemplo de esto puede ser:
<%= will_paginate(User) %>
esto nos producira el siguiente codigo HTML
Como puedes ver el helper usa elementos div para contener los links o span para la paginación permitiendo de esta manera customizar el estilo de la paginacion completamente.
Un ejemplo de estilo agradable puede ser el siguiente
Algunas opciones que podemos pasar por parametro son:
container
Determina si el contenedor
esta incluido en el html generado por defecto es true.
:class
Agrega clase ccs en el contenedor
:previous_label
Permite especificar el texto de la accion previous page
:next_label
Permite especificar el texto de la accion next page
:page_links
Determina si esta incluido la opcion de mostrar los links de las paginas individuales sino solo muestra los links anterior y siguiente, por defecto es true :inner_window
uter_window
Permite customizar el numero de paginas a mostrar
Haciendolo a tu manera
Que pasa si nuestro querido y adorable diseñador nos pide hacer una paginacion con el siguiente formato
Tenemos dos opciones, o lo obligamos a seguir los parametros definidos en will_paginate o le partimos la cabeza
eso fue en broma eh? bue un poquito no mas
.
Una solucion factible seria la de sobreescribir los metodos del helper de paginate, entonces podriamos armar una clase parecida a esta
Como puedes ver the linkrenderer es una subclase de WillPaginate::LinkRenderer, el principal metodo que genera la vista de la paginacion to_html.
Una vez armado nuestra clase de paginacion customizada, podemos probarla de la siguiente manera
La opcion :render acepta el nombre de una clase como parametro.
Si queremos que por defecto cargue nuestra clase podemos sobreescribir la variable global
y ahora solo usariamos <%= will_paginate(@users) %>
Enjoy!
Posted by mauro on Feb 19, 2009 in
Rails
Si queres visualizar en tu prompt el status de algun proyecto git inserta el siguiente codigo en el archivo .bashrc del home de tu usuario
Posted by mauro on Feb 3, 2009 in
Rails
La creación de widgets en una aplicación es de mucho provecho ya que nos da numerosas ventajas como poder mostrar un conjunto de datos en cualquier sitio solo poniendo un codigo javascript.
Para este articulo vamos a tomar de ejemplo un codigo al estilo del.ic.ous
widget_controller.rb
class WidgetController < ApplicationController
layout nil
session :off
before_filter :validate_api_key, :only => [:user_bookmarks]
def user_bookmarks
# Find bookmarks assigned to owner of the API key
@bookmarks = Bookmark.find_by_user_id(@key.user_id, :order => 'created_at desc', :limit => 10)
end
protected
def validate_api_key
# Assuming we defined API_KEY_REGEX elsewhere
return render(:text => 'Invalid API key.') unless params[:api_key] =~ API_KEY_REGEX
# You may want to validate the key against your database and/or log the request
return render(:text => 'Invalid API key.') if not @key = Key.find_by_hash(params[:api_key])
end
end
Por razones de perfomance, podemos deshabilitar las sesiones del controlador y la renderizacion de los layout, ya que el usuario no esta visitando nuestro sitio fisicamente, por lo tanto no es necesario estas caracteristicas.
user_bookmarks.rhtml
(function(){
document.write('<div class="customCSSclass" id="appName-widget">');
<% @bookmarks.each do |bookmark| -%>
document.write('<a href="<%= bookmark.uri %>"><%=h bookmark.title %></a><br />')
<% end -%>
document.write('</div>') })()
Lindo y simple, escribimos directamente en el DOM del objeto
Ahora solo nos queda armar la ruta en el route.rb
widget_routes.rb
map.connect '/widget/:action/:api_key', :controller => 'widget', :api_key => /.*/
ahora para embeber el widget en cualquier sitio tenemos que insertar el siguiente codigo javascript
<script type="text/javascript" src="http://yoursite.com/widget/user_bookmarks/A4923D2342JF"></script>
<style type="text/css">
.customCSSclass a{text-decoration:none;}
</style>
Posted by mauro on Feb 3, 2009 in
Rails
En este articulo vamos a explicar como instalar el fantastico modulo mod_rails que nos va a permitir correr aplicaciones rails en apache de una forma muy optima
1er Paso: instalación de ruby enterprise.
Primero vamos a instalar Ruby Enterprise Edition cómo recomiendan los chicos de passenger (mod_rails), también podemos usar el ruby convencional.
Para esto nos bajamos el .tar.gz con los sources y lo descomprimimos:
wget -c http://rubyforge.org/frs/download.php/51100/ruby-enterprise-1.8.6-20090201.tar.gz
tar -xvzf ruby-enterprise-1.8.6-20090201.tar.gz -C /opt
Yo lo voy a instalar en /opt que es dónde se instalan los paquetes que no vienen con la distro entonces quedaría:
/opt/ruby-enterprise-1.8.6-20090201/
Instalamos las libs necesarias para compilar ruby EE:
apt-get install g++ zlib1g-dev libssl-dev build-essential libreadline5-dev libmysqlclient15-dev
ahora instalamos ruby
cd /opt/ruby-enterprise-1.8.6-20090201/
./installer
en el caso que no funcione tratar con
./installer --no-tcmalloc
En la opcion que da para elegir el path de instalacion se puede poner:
/opt/ruby-enterprise
o directamente hacer un link
ln -s /opt/ruby-enterprise-1.8.6-20090201/ /opt/ruby-enterprise
Ahora tenemos que crear una serie de links simbólicos para que nos quede la versión de Ruby EE instalada correctamente en el sistema como default:
ln -fs /opt/ruby-enterprise/bin/gem /usr/bin/gem
ln -fs /opt/ruby-enterprise/bin/irb /usr/bin/irb
ln -fs /opt/ruby-enterprise/bin/rake /usr/bin/rake
ln -fs /opt/ruby-enterprise/bin/rails /usr/bin/rails
ln -fs /opt/ruby-enterprise/bin/ruby /usr/bin/ruby
ln -fs /opt/ruby-enterprise/lib/ruby/ /usr/lib/ruby
2er Paso: instalación de mod_rails
Ya tenemos instalado Ruby EE entonces ahora vamos a instalar mod_rails.
bajamos los sources de passenger:
wget -c http://rubyforge.org/frs/download.php/48622/passenger-2.0.6.tar.gz
tar -xvzf passenger-2.0.6.tar.gz -C /opt
Instalamos las lib necesarias para compilar:
apt-get install apache2-prefork-dev build-essential
Instalamos apache prefork:
apt-get install apache2-mpm-prefork
Ahora tenemos que instalar mod_rails:
cd /opt/passenger-2.0.6
./bin/passenger-install-apache2-module
3er Paso: Configurar apache con modrails
Editamos el archivo /etc/apache2/mods-available/passenger.conf
y ponemos lo siguiente:
PassengerRoot /opt/passenger-2.0.6
PassengerRuby /opt/ruby-enterprise/bin/ruby
editamos el archivo /etc/apache2/mods-available/passenger.load
y ponemos lo siguiente:
LoadModule passenger_module /opt/passenger-2.0.6/ext/apache2/mod_passenger.so
luego tenemos que activar el modulo entonces ejecutamos el siguiente comando:
Listo ahora lo único que tenemos que hacer cada vez que agregamos una app
es agregar un virtual host en apache.
Editamos el archivo /etc/apache2/sites-available/nueva_app.com
y ponemos lo siguiente:
ServerName nueva_app.com
ServerAlias www.nueva_app.com
DocumentRoot /var/www/apps/nueva_app.com/public
RailsBaseURI /
CustomLog /var/log/apache2/nueva_app.com.log "%h %l %u %t \"%r\" %>s %b"
Como pueden ver puse el archivo de log separado del lo general de apache.
luego de esto habilitamos el nuevo virtual host
a2ensite nueva_app.com
habilitamos el modulo rewrite(importante! sin esto passenger no funciona)
a2enmod rewrite
y reiniciamos apache:
/etc/init.d/apache2 reload
disfruten!
Posted by mauro on Feb 2, 2009 in
Rails
Una herramienta muy útil a la hora de programar en rails es la gema autospec o autotest, esta gema nos notifica todo el tiempo sobre el estado de los specs, que métodos faltan testear, etc..
Si somos linuxeros tenemos la posibilidad de configurar el sistema para que todos los mensajes del autospec se muestren como notificaciones en el escritorio.
Paso 1: Instalar Mumbles
Mumbles es un moderno plugin de notificaciones para el escritorio de gnome, muy similiar al growl de mac.
Debemos bajarlo e instalarlo segun la distribucion del inux que tengamos, la direccion es
http://www.mumbles-project.org/download/
Paso 2: Instalar Mumbles
Mumbles es un moderno plugin de notificaciones para el escritorio de gnome, muy similiar al growl de mac.
Debemos bajarlo e instalarlo segun la distribucion del inux que tengamos, la direccion es
http://www.mumbles-project.org/download/
Paso 3: Instalar AutoTest
Instalamos ZenTest
Luego corremos dentro del RAILS_ROOT el comando autotest
Paso 4: Autotest con mumbles
Editamos el archivo ~/.autotest con el siguiente contenido
module Autotest::Mumbles
def self.mumbles title, msg
system "mumbles-send "#{title}" "#{msg}""
end
Autotest.add_hook :red do |at|
errors = at.files_to_test.map { |k, v| "#{k}:n #{v.join("n ")}"}.join("nn")
mumbles "TESTS FAILED", errors
end
Autotest.add_hook :green do |at|
#res = at.results[/d+ tests.*$/]
res = at.results.scan(/Finished.*failures/m).to_s.gsub(/e[32m/,'')
mumbles "TESTS PASSED", res
end
end
y probamos!!!
Posted by mauro on Dec 15, 2008 in
Rails
Enviar email hoy en dia desde tu aplicacion web es muy util, para validar usuarios, notificaciones, boletines, etc..
En este articulo veremos en unos simples pasos como lo podemos hacer con rails
Revision
- script/generate mailer notify
- Crear modelo (models/notify.rb)
- Crear tu template para el email (views/notify/)
- Enviar tu mensaje
- Tener instalado postfix o sendmail
#Generar el modelo mailer
$ script/generate mailer notify
#Crear el metodo en el modelo mailer que enviara el email(models/notify.rb)
def send_friend(option)
@recipients = option[:emailamigo]
@from = "no-reply@upitiaya.com"
headers "Reply-to" => "#{option[:email]}"
@subject = "Te recomendaron un enlace"
@sent_on = Time.now
@content_type = "text/html"
body[:nombre] = option[:nombre]
body[:nombreamigo] = option[:nombreamigo]
body[:mensaje] = option[:mensaje]
body[:pagina] = option[:pagina]
end
Crear la vista del metodo (views/notify/send_friend.html.erb)
#las variables como body[:pagina] definida en el metodo send_friend se acceden como @pagina desde la vista
<p>Hola @nombreamigo, tu amigo <i><%= @nombre %></i>. te recomendo el siguiente link </p>
<a href="#{@pagina}">"#{@pagina}"</a>
<br/>
<p>"#{@mensaje}"</p>
#Ahora armamos la accion en el controlador
def send_friend
Notify.deliver_send_friend(params[:email])
end
Si tenemos postfix instalado localmente, deberia funcionar sin problema, cualquier duda deja tu comentario!
En la parte ll de este articulo veremos como enviar un email usando una cuenta de gmail.
Posted by mauro on Dec 15, 2008 in
Rails
En este articulo vamos a ver como podemos descargar los resultados de una busqueda en una planilla de calculo excel.
#Controlador: expedientes-controller.rb
def excel
headers['Content-Type'] = "application/vnd.ms-excel"
headers['Content-Disposition'] = 'attachment; filename="expedientes.xls"'
headers['Cache-Control'] = ''
@expedientes = Expediente.find(:all)
render :layout=> false
end
#vista: expedientes/excel.html.erb
<table align="center" cellspacing="1" cellpadding="1" border="1">
<tr>
<th>Nro Expediente</th>
<th>Registrante</th>
</tr>
<%for resource in @expedientes%>
<tr>
<td><%=resource.nro_expediente%></td>
<td><%=resource.persona.nombre_completo%></td>
</tr>
<% end %>
</table>
Como veran solo hay que generar un html con tablas, ya que excel lee perfectamente este tipo de html como planilla y luego configurarlo con la cabecera de excel, para que el navegador lo descarge como tal y listo
.