Rails: Si necesitas callbacks, workers y estás pensando en arrays de objetos……..aquí te dejo las claves para entenderlo!

rubyonrailsHe estado trabajando en un proyecto express dentro de ASPgems, que consiste en desarrollar una idea y el compromiso de entregarlo en producción en una semana. No sé si otras empresas disponen de esta oportunidad en la que poder participar, pero yo me apunté sin dudarlo, es una experiencia muy buena, ya que te enfrentas a situaciones que en ocasiones los tienes resueltos y este tipo de reto, hace que vuelvas a tener la alerta activa. Os voy a contar en que consiste el proyecto para poder entrar en situación y entender de lo que intento explicar y las soluciones que he aplicado.

La aplicación consiste en saber que gemas está utilizando cada proyecto que se de de alta en la aplicación, por lo que debe disponer de una interfaz de usuario, para dar de alta un nombre de proyecto, una URL del repositorio para poder saber en su Gemfile las gemas que utiliza y leer en RubyGems  más información sobre ellas.

Según estaba planteando los retos de los puntos claves de la aplicación, lo primero que debía solucionar es, cómo interactúa esa interfaz de usuario y el tiempo de proceso que se lleva el disponer de toda la información de lectura del Gemfile, así como el reto en tiempo de ir a buscar cada una de las gemas a Rubygems y conseguir la información adicional de la descripción y el resumen. Esto plantea dos tipos de accesos externos que se necesitan para obtener información, uno al repositorio del proyecto y el otro a Rubygems y eso lleva un coste que hay que medir y tratar.
Seguir leyendo

Ruby: métodos de clase y métodos de instancia – cambiar la palabra es “La he liado parda”

med_Pragmatic.Bookshelf.Programming.Ruby.Jul.2013.ISBN.1937785491.pdfEn ocasiones es difícil explicarse por medio de la palabra, eso lo tengo muy claro, pero si a esto le sumas el poner la palabra definida erróneamente, puede llevar a términos que no es lo mismo, confundir al que lo está leyendo y piensas, “la he liado parda”. El caso es que he cometido el error de cambiar una palabra y poner que una solución a un problema (no es relevante el problema de origen para lo que voy a contar) era un método de clase Myclass.method en vez de un método de instancia Myclass#method  y como es lógico no es lo mismo, eso está claro, pero para que no te pase a ti lo mismo, voy a tratar de explicarlo, aunque lo de equivocarse, si eres humano, en ocasiones te puede ocurrir.

Quiero tratar el tema desde dos puntos de vista diferentes y quería hablar de los métodos de instancia y los métodos de clase, cuando tenemos una clase sin herencia y la otra es cuando tenemos herencia y explicar que self.class.method no es lo mismo que ClassName.method cuando hacemos herencia entre clases. Otro tema que quiero explicar es la concatenación de métodos, mediante los métodos de clase.
Seguir leyendo

Method_missing(): ¿me ayuda a eliminar código duplicado? – espera, déjame que te lo explique

Metaprogramming RubyEn esta ocasión me gustaría hablar del method_missing(), me lo he encontrado en varias ocasiones y siempre lo he mirado de lado, no sea que pase algo.

Fuera de bromas, es otro de los temas, que tenía ganas de comentar y que mejor ocasión después de ver un vídeo hablando de este tema, leer sobre ello y preguntar a Paolo Perrotta sobre su charla en vídeo, que recomiendo ver por su alto contenido de información, titulado “The Revenge of method_missing()”, espera no te preocupes en buscarlo, que lo pongo al final del post, vamos por partes,  voy a tratar de explicar a mi manera con la ayuda de la información proporcionada por Paolo, tal como yo entendido y cuando debemos o no, utilizar este método. Pero lo principal es conocer, para poder saber aplicarlo.

Comencé a leer hace tiempo ya (vuelvo a ver capítulos de vez en cuando como en este caso), el libro de Paolo Perrotta @nusco en twitter, “Metaprogramming Ruby” que comenta en el capítulo 2 sobre los métodos, por cierto muy interesante, como todo el libro y comienza la problemática, cuando tenemos definidos métodos, cuyo código está repetido en otros métodos dentro de la misma clase. En ese caso podemos pensar ¿method_missing() puede ayudarnos a que nuestro código no se repita? busquemos la respuesta y el posible razonamiento.
Seguir leyendo

Un modelo sólo debe hablar con su asociación inmediata – Law of Demeter con Rails

books

Una característica muy interesante que tiene Ruby on Rails, son las  asociaciones de Active Record, que a mi modo de ver nos permite de alguna forma el enlazar unos modelos con otros y en particular con las vistas. Sin embargo, también podemos cometer, a pesar de que esta funcionalidad tiene su alcance, puede hacernos complicada la refactorización y que comentamos errores.

En esta ocasión voy a hablar de “Law of Demeter”, que hace tiempo tenía ganas de comentar sobre todo algunos de sus aspectos y confusiones, que yo mismo he llegado a tener y que me gustaría compartir. Cuando la escuché hace tiempo ya, de un compañero de trabajo, Javier Ramirez @supercoco9, que por otro lado no quiero dejar pasar la ocasión para hacerte una sugerencia si eres desarrollador, echa un vistazo a su nuevo proyecto que mola un montón teowaki.com, que además junto con otro compañero que tuve el placer de trabajar en el mismo proyecto, Diego Rodríguez @diec123 (no sé si Diego pensará lo mismo 🙂 ) lo han puesto en marcha y que me han comentado en muchas ocasiones, cosas que han hecho y cómo las han hecho, se aprende mucho hablando con ellos, gracias a ambos por esos buenos momentos!!.

Dicho esto, voy a tratar de explicar lo que es Law of Demeter. Bajo mi punto de vista, no es una idea en si misma que podamos decir lo buena que es, es una ley que deberíamos tener en consideración. El caso es que partimos de la base en la que consideramos: “que un modelo sólo debe hablar con su asociación inmediata” y no deberíamos encontrarnos con casos en los que un modelo hable con la asociación de la asociación y además saber la propiedad de la asociación, se trata de un caso de acoplamiento.
Seguir leyendo

Algunos temas jugosos sobre métodos de Ruby – Proc, Blocks y Lambdas

HamburgerSegún vas profundizando y fijándote en los detalles, Ruby (Mi guía de Ruby – Las clases y curiosidades OOP) es uno de esos lenguajes que te va capturando hasta el punto no dejan de sorprenderte cada día. En alguna ocasión se ha discutido sobre el cómo funciona cada uno de ellos, pero creo que merece la pena hacer una presentación. Vamos a echarle un vistazo:

Los bloques es una de esas cosas que tiene Ruby y que es muy potente, pero además es que es muy necesario tener muy claro cómo funciona. Veamos un ejemplo de bloque, vamos a pensar en ¿cómo podríamos poner código Ruby en un objeto para que pueda pasar  y llamarlo después?, la respuesta es un bloque.

¿cómo definimos un bloque?

Primero antes de nada, hay que saber que un bloque no es un objeto, veamos un ejemplo que es la mejor forma de ver su sintaxis. Lo podemos hacer de dos formas:

 > [1,2,3].each { |x| puts x*2 }
2
4
6
=> [1, 2, 3]

> [1,2,3].each do |x|
>         puts x*2  # block is everything between the do and end
>  end
2
4
6
=> [1, 2, 3]

Pero cuidado podemos estar tentados de hacer  lo siguiente, para más tarde utilizarlo: Seguir leyendo

¿Cuándo puedo o debo hacer uso de alias_method_chain?

Ruby Mag #26 is onlineEl primer encuentro que he tenido con alias_method_chain, es en la resolución de un problema con una gema dentro de un proyecto, en la que no me reconocía un adaptador, pero en mi caso, no me hacía falta que lo reconociera, sólo necesitaba que continuara sin hacer mucho más, un Monkey-patching o Freedom-patching es la solución, pero como todo no es bueno abusar de ello.

Pensé que era el único camino de su existencia y aplicación, pero me he vuelto a encontrar con él y explico en que otras circunstancias se debería utilizar. Existen casos en los que te puedes encontrar que la herencia y super no pueden hacer su trabajo y además no tenemos el control de la clase cuyo comportamiento estamos intentando de modificar. Esto dependerá de cómo lo hemos definido originalmente. ¿lo hemos definido en la propia clase, o en un módulo que se incluye en la clase? Seguir leyendo

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

RubyEn 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.
Seguir leyendo