Antes de aprender Rails aprende Ruby: Primeros pasos necesarios en Ruby


booksEn mi opinión personal y bajo mi experiencia, es necesario que antes de aprender RubyOnRails, debes conocer el lenguaje de programación Ruby, para que cuando veas código RubyOnRails, puedas interpretar y entender muchas cosas de las que hace Ruby dentro de Rails, pero además tampoco sacarás el partido necesario a estos dos lenguajes de programación tan potentes.

Primeros pasos en Ruby

Una de las reglas fundamentales de Ruby es que tengamos en cuenta que todo es un objeto, es importante que este punto lo tengas claro ya que es un lenguaje orientado a objetos, en un momento sabrás el motivo de esta afirmación.

Podemos decir que Ruby es un lenguaje interpretado y que tiene un interprete del lenguaje llamado MRI, por ejemplo desde consola del interprete podemos escribir directamente e interactuar con el lenguaje. ¿Cómo podemos saber que versión tenemos instalada? desde línea de comando ponemos ruby -v y nos devuelve la versión que tenemos instalada. Un tema interesante sería disponer de rmv para las distintas versiones que podríamos tener en entornos para desarrollar, es decir, podríamos tener un entorno con la versión 1.8 y otro con la 1.9 si en ambos proyectos requieren este tipo de versiones. Si necesitamos crean ambientes de los proyectos con librerías específicas, lo haríamos con los gemset.

Otra regla es que por convención en Ruby, las constantes y las clases se inician en mayúsculas, los métodos y las variables en minúsculas. Pongamos un ejemplo:

$global_var = 5 # las variables globales empiezan por $
class TestVar  =====>> Los nombres de las clases por convención deben comenzar por mayúsculas
        @@my = 6 =====>> las variables de clase comienzan por @@
        CONST_VAL = 7 =====>> Las constantes deben ser en mayúsculas y/o utilizar el _ para compuestos
        def initialize(x) =====>> nuestro constructor
                    @name = x =====>> Las variables de objeto comienzan por @
                    @@my += 1 =====>> Ccada objeto comparte @@my por ser variable de clase
         end
         def self.current_user =====>> Método de clase que nos lee el atributo
                  @@my
         end
         def self.current_user=(y) =====>> método de clase, modificador de atributo
         end
         def inst # método de objeto, lector
                @name
         end
         def inst=(i) # método de objeto, modificador
               @name = i
         end
end

También tenemos que por convención todas las expresiones en Ruby devuelven un resultado y la última expresión en un método, es lo que se devuelve. Veamos algunos ejemplos en la consola de Ruby:

5.times { puts «Hello Ruby World» }

Podemos observar que tenemos un número que tiene asociado un método times, recuerda que ya hablamos anteriormente, que en Ruby todo es un objeto, por tanto estas cosas ya deben ser naturales el verlas así. En el caso de puts, también es otro método que le estamos pasando un parámetro y aprovecho para decir que también en Ruby el paso de parámetros el poner () es opcional, entonces seguro que estás pensando si podríamos haber puesto puts(«Hello Ruby World»). La respuesta es, lo podemos hacer así.

Los objetos en Ruby tienen un comportamiento específico, es decir, no existe el string o el número como tal por así decirlo, estos objetos disponen de métodos, de clases, se pueden heredar y se pueden modificar, ya que como ya hemos mencionado en Ruby todo es un objeto y todas las definiciones están abiertas incluso en tiempo de ejecución.

Por otro lado, los comentarios los podemos utilizar con # colocándolos al principio y al final de cada línea de código que escribamos.

Seguimos, qué pasa si hacemos en consola la operación 1 + 2 ¿qué crees que devuelve? un 3 verdad. Pero en realidad es la operación de dos objetos números cuyos valores son 1 y 2 y nos arroja un objeto como resultado con un valor 3, recuerda siempre pensar en que todo es un objeto. Pero si pretendemos hacer la misma operación pero de esta forma 1 + «Hello», ¿qué crees ahora que devolvería? si, un error, ya que estamos sumando dos cosas distintas y nos arroja un mensaje de error. La solución, es que disponemos de un método que nos permite equilibrar ambos objetos y realizar la operación 1.to_s + «Hello» y nos devuelve «1Hello». Existen otros métodos de ayuda interesantes como el pasar a mayúsculas o mininúsculas entre otros  muchos más.

En el mundo Ruby siempre hablaremos de métodos y no de funciones, además es un lenguaje orientado a objetos y no a clases. Veamos cómo definimos un método en Ruby:

def current_user
      «Current User»     
end

La última expresión del método current_user es lo que nos devuelve dicho método, es decir, nos devolverá «Current User».Si queremos llamar al método lo haremos de la siguiente forma desde la consola: puts current_user

Para pasar parámetros a métodos, podemos hacerlo de distintas formas, pasar únicamente el parámetro y en la definición disponer de def current_user(user), pero si no tenemos user no visualiza nada, en ese caso lo hacemos como lo siguiente:

def current_user(user = «without user») ====> inicializador por defecto en caso de no tener contenido user cuando se pase al método
      «Current User #{user}»  ===>mejor en este formato  #{}, pero podríamos poner también «Current User» + user 
end

Ahora imagina que podemos hacer que #{my_user} sea un método:

def my_user
      «I am a User»  
end

def current_user(user = «without user»)
      «Current User #{user} #{my_user}»  
end

 Obtenemos el resultado de:

consola> puts current_user(«Carlos»)
Resultado ==>> Current User Carlos I am a User

consola > puts current_user
Resultado ==>> Current User without user I am a User

Finalmente veamos el siguiente ejemplo:

class Salary

          def pay
                  10.times do |i|
                         puts «#{i+1} Paying»
                   end
           end

end

class Salary

         def pay
                   puts «nothing to pay today»
         end

end

salary = Salary.new
salary.pay

Tenemos dos clases Salay que disponen ambas de dos métodos que se llaman igual, ¿Cuál crees tú que debería ser el resultado si instanciamos y llamamos al método pay? el resultado es que sobreescribe el método primero y se queda el segundo arrojando el resultado de «nothing to pay today». En este ejemplo puedes ver la gran flexibilidad de Ruby.

Si necesitas ampliar más información sobre las clases y variables de instancia y demás, te dejo este post que escribí en el que especifico todo estos detalles. Mi guía de Ruby – Las clases y curiosidades OOP

Recursos que debes tener siempre disponibles:

RUBY: http://www.ruby-lang.org/es/
RUBYONRAILS: http://rubyonrails.org/
GUIAS DE RAILS : http://guides.rubyonrails.org/
API: http://api.rubyonrails.org/
TUTORIAL: http://ruby.railstutorial.org/

Deja un comentario