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
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.

$ 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.
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.
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
posted on 25 Sep 2009 | Events
You can already see the EuRuKo 2009 videos on blip.tv
http://euruko.blip.tv/
posted on 13 Aug 2009 | Rails
Facebooker is a great plugin/gem for Rails which allows to connect Feacebook, 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.
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!
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 ;)
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/
posted on 14 May 2009 | Rails
CSV is commonly used to import data from an external source. You can populate your Rails applications with emails, user names, phone numbers etc. from other applications, databases, excel files...
Let me show you an example.
#users.csv
kevin, kevin@gmail.com
Jhon, jhon@gmail.com
require 'csv'
CSV.open('users.csv', 'r').each do |row|
User.create(:username => row[0], :email => row[1])
end
The open method, opens the specified file, parses lines from given stream and returns every line in an array. The diferent fields can be accessed by row[0], row[1] etc.
If you are a Windows user you must use rb as mode. The b option is the binary file mode needed in DOS/Windows environments.
The default separator is ','. You can use another separator passing it as a third parameter
CSV.open('users.csv', 'r', ';' )
More info
www.ruby-doc.org/stdlib/libdoc/csv/rdoc/classes/CSV.html