How to use in-memory SQLite database for Rails testing

posted on 17 Apr 2010 | Rails

Contrary to popular belief, SQLite is a great database, and the most important thing.... it's very fast!

Let's view how to use SQLite to store your test database and reduce considerably the time needed to run all your tests.

First of all we need to install memory_test_fix plugin

./script/plugin install git://github.com/rsl/memory_test_fix.git

and now you can configure your test database

#/config/database.yml
test:
  adapter: sqlite3
  database: ":memory:"
  verbosity: silent

Now try to run your tests... ;)

Visibilidad de los métodos en Ruby

posted on 10 Mar 2010 | Ruby

Algo que no queda del todo claro a la mayoria de gente que aprende Ruby, incluso a los que ya tienen cierta experiencia es como funciona exactamente la visibilidad de los métodos en Ruby. Según sus definiciones:

  • public: pueden ser invocado por cualquiera. Los métodos son public por defecto, excepto el método initialize que es privado.

  • protected: pueden ser invocados por cualquier objeto de la clase o cualquier objeto de las clases heredadas.

  • private: solo se pueden invocar desde el contexto del objecto actual. No se pueden invocar métodos private de otros objetos aunque sean de la misma clase.

La diferencia entre protected y private es sútil, pero es importante tenerla clara. Vamos a intentar aclararlo con un ejemplo.

# person.rb
class Person  
  def es_mayor_que?(p)
    self.age > p.age
  end
  
  protected
  def age
    calculate_age
  end
  
  private
  def calculate_age
    rand(99)
  end
end

El método es_mayor_que? es público y nos va a servir para comparar la edad de dos personas a ver cual es mayor.

El método age está declarado como protected ya que en principio no lo necesitamos fuera del contexto del objeto, únicamente necesitamos acceder al método age para comparar las edades de dos personas.

El método calculate_age es privado ya que nos genera una edad para un objeto determinado y necesitamos que sea únicamente accesible desde el objeto en cuestión.

>> require 'person'
>> quentin = Person.new
>> aaron = Person.new
>> quentin.es_mayor_que? aaron
=> true
>> aaron.es_mayor_que? quentin
=> false

Uso de self

  • Los métodos public pueden ser invocados con self o sin él, o dicho de una manera más técnica, el receptor puede ser cualquiera.
  • Los métodos protected pueden ser invocados por self o por otro objeto. Cuando invocamos un método protected, self puede ser ignorado.
  • Los métodos private no se invocan nunca con self ya que está implicito y por definición no pueden ser invocados por nadie más.

Referencias

weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby
blog.zerosum.org/2007/11/22/ruby-method-visibility

Una nueva manera de ver los logs con Clarity

posted on 03 Feb 2010 | Rails, Linux

Revisando el twitter esta mañana y saltando de enlace en enlace he encontrado esta pequeña gema a la que le encuentro gran utilidad, se trata de Clarity una utilidad que nos permite ver los logs en un navegador y realizar las dos acciones que realizamos con mas frecuencia sobre ellos: grep y tail.

Clarity

$ sudo gem install clarity 
  Password:
  Successfully installed clarity-0.9.8
  1 gem installed
  Installing ri documentation for clarity-0.9.8...
  Installing RDoc documentation for clarity-0.9.8...
  Could not find main page README.rdoc # anyone know how to get rid of this?!
  Could not find main page README.rdoc
  Could not find main page README.rdoc
  Could not find main page README.rdoc

$ clarity log
  Clarity 0.9.8 starting up.
   * listening on 0.0.0.0:8080
   * Log mask(s): **/*.log*

En el puerto 8080 tendréis accesible la aplicación. Una opción interesante es la posibilidad de arrancar la aplicación protegiendo el acceso mediante usuario y contraseña, lo que nos permite usar Clarity en el servidor, para visualizar los logs de producción de nuestra aplicación o de Apache, Nginx etc. Podemos usar Clarity en un servidor de produccion generalmente de esta manera

$ clarity /var/log --include '*/**'

Un buena idea referente a los logs de las aplicaciones Rails suele ser colocar el directorio log de la aplicación en algun subdirectorio dentro de /var/log y enlazarlos mediante un enlace simbólico. Con esto conseguimos tener todos los logs centralizados.

En el fondo Clarity no deja de ser un visualizador de archivos en un navegador sobre los cuales podemo hacer grep o tail, algo que se puede hacer perfectamente en la consola, pero la verdad es que resulta mucho más práctico poderlo realizar en un navegador, guardar las url de las consultas que más realizamos, dar acceso a gente que a lo mejor no puede acceder a los servidores etc.

Bye, bye Wordpress

posted on 15 Jan 2010 | General

En la pasada EuRuKo oi hablar por primera vez de Jekyll, un sistema para crear sitios estáticos creado por Tom Preston-Werner, el fundador de Github. La idea de poder gestionar mi blog desde el editor que uso normalmente (Textmante) y utilizar git para actualizarlo me atrajo bastante ya que prácticamente la totalidad de mi tiempo de trabajo lo paso con la consola y el editor abiertos. Como siempre, la falta de tiempo hizo que lo dejara aparcado, pero después de dedicar algo de tiempo a probarlo a fondo me he decidido por esta solución.

Os dejo algunos enlaces por si os pica la curiosidad.

Character string processing for computer programmers

posted on 30 Sep 2009 | General

After my talk in Conferencia Rails 2008, Balint Erdi sent me an email with a very interesting link about character string processing for computer programmers that I forgot to publish and I've just found it casually. Is the first of a three-part essay, titled Characters vs. Bytes

EuRuKo 2009 videos are now available!

posted on 25 Sep 2009 | Events

You can already see the EuRuKo 2009 videos on blip.tv

http://euruko.blip.tv/

Using Facebooker with jQuery

posted on 13 Aug 2009 | Rails

Facebooker is a great plugin/gem for Rails which allows to connect Facebook, use your API and build applications, but.... only works with Prototype.

Don't worry, you can use Facebooker with jQuery easily. Find this code line in your layout

<%= init_fb_connect('XFBML') %>

and replace with

<%= init_fb_connect('XFBML', :js => :jquery) %>

And that's all! Now Facebooker works fine.

How to use in_place_editor in Rails 2.x

posted on 22 Jul 2009 | Rails

Install the plugin

./script/plugin install git://github.com/rails/in_place_editing.git

We supose that we have a "State" model with a "name" attribute and we want to edit it “in place”. Add in your controller

class StatesController < ApplicationController
  in_place_edit_for :state, :name
end

This method adds an action called "set_state_name" which updates the attribute specified, in this case "name" (see the code for more details).

Now, you can use the helper that the plugin adds

<span id="edit_field"><%=h state.name %></span>
<%= in_place_editor 'edit_field',  :url => url_for(:action => :set_state_name, :id => state.id) %>

Important Note: This plugin has a problem: it isn't RESTful, you can't do this

<%= in_place_editor 'edit_field',  :url => url_for(:action => :update, :id => state.id) %>

The method used to send the form is POST, you can't access a resource via PUT method, therefore you can't access "update" action in the controller.

That's all!

Fixing fieldWithErrors behavior

posted on 30 Jun 2009 | Rails

Dealing with errors in Rails forms can be a hard task. When a form field has errors, ActionView wraps the input in a div of class "fieldWithErrors". The result is something like this

<p><div class="fieldWithErrors"><input id="user_name" name="user[name]" type="text" value="" /></div></p>

A div inside a paragraph ?¿?¿? This behavoir can be very annoying and isn't XHTML compliant. A simple solution is add this line at the end of environemnt.rb or in a file under lib dir:

ActionView::Base.field_error_proc = Proc.new { |html_tag, instance| "<span class=\"fieldWithErrors\">#{html_tag}</span>" }

This is the result

<p><span class="fieldWithErrors"><input id="user_name" name="user[name]" type="text" value="" /></span></p>

A single line that simplifies your life ;)

Define index lengths in your migrations

posted on 27 May 2009 | Rails

Defining an index length is a common practice in order to avoid large data indexes, and improve performance. Some time ago, I sent a patch to Rails core, which added the functionality to define index lengths in the migrations. For example:

add_index(:accounts, [:name, :surname], :name => 'by_name_surname', :limit => 10)

While I wait a decission from the Rails core members about this patch, I decided to release this functionality built-in in a plugin.

With this plugin, you can specify index lengths in your migrations easily. Here are some examples:

add_index(:accounts, :name, :limit => 10)

generates CREATE INDEX by_name ON accounts(name(10))

add_index(:accounts, [:name, :surname], :name => 'by_name_surname', :limit => 10)

generates CREATE INDEX by_name_surname ON accounts(name(10), surname(10))

add_index(:accounts, [:name, :surname], :name => 'by_name_surname', :limit => {:name => 10, :surname => 20})

generates CREATE INDEX by_name_surname ON accounts(name(10), surname(20))

You can download it from my GitHub repo github.com/eparreno/mysql_index_length/