Change - Know that nothing stays the same

Rails 4 y los pequeños cambios que suman

February 21, 2016

ror
ruby
rails 4
minitest
spanish

Only spanish content for today

This is going to be a spanish post, sorry if you dont speak spanish but this is a set of posts to increase part of the spanish' Rails community. We can find a lot of good enlgish contents but I haven't found the same, or at least a good number, of spanish contents.

Vientos de cambio

Hace poco tiempo pase de centrar mi trabajo de AngularJS a Ruby, mas especificamente Rails. Habia olvidado lo como que se trabaja con Rails.

Rails no tiene nada nuevo -a grandes rasgos- ni hace las cosas de forma distinta en un 100%, pero ha sabido crecer en simplicidad y al mismo tiempo no cerrar puertas para dejar meter mano a quien quiera y cambiar lo que a uno se le antoje. Esta simpleza y robustez ayuda a cubrir cualquier necesidad que se pueda tener al momento de hacer un desarrollo.

Muchas palabras y poco codigo

Voy a poner algunos ejemplos de las cosas que mas me han gustado de la vuelt a rails:

1. Minitest y como estar seguro que seguimos funcionando.

Me pasó tener un sistema donde la prueba de su funcionamiento eran solo mis pruebas manuales, por eso cuando volví a usar minitest y testear todo automaticamente fue una mejora de mi tiempo.

Rails4 usa minitest como su framework por default para testing. Tenemos dos formas de hacer tests:

  • TestCase
class StatusTest < ActiveSupport::TestCase
  test "the truth" do
    assert true
  end
end
  • Minitest Specs
describe User do
  it 'should assert the truth' do
    variable.must_equal true
  end
end

en mi caso la opcion de minists spec me resulta mas simple.

Para hacer uso de esa opcion nuestro test_helper.rb tiene que habilitar dicha posibilidad:

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'minitest/rails'
require 'minitest-matchers'
require 'minitest/reporters'
require 'minitest/spec'

reporter_options = { color: true, slow_count: 5 }
Minitest::Reporters.use! [Minitest::Reporters::SpecReporter.new(reporter_options)]

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
  extend MiniTest::Spec::DSL
  include ActiveJob::TestHelper
  include Warden::Test::Helpers

  register_spec_type(self) do |desc|
    desc < ActiveRecord::Base if desc.is_a?(Class)
  end
end

class MiniTest::Unit::TestCase
  include ActiveJob::TestHelper
  include Warden::Test::Helpers
end

2. Serialize - O como guardar una Array en un campo sin volverse loco

Esta es una gran incorporacion que ha hecho rails. Muchas veces me encontraba armando una relacion has_many para guardar ids de un modelo.

Para hacer uso de esto hay que:

  1. crear el campo de tipo string en la tabla que usaremos
  2. configurar en el modelo donde y que se va a serializar
  3. opcional: podemos cambiar como vamos a guardar o leer esta serializacion

(1)

class AddParticiapantsIdsToTeams < ActiveRecord::Migration
  def change
    add_column :teams, :participants_ids, :string
  end
end

(2)

dentro de la clase Teams ponemos:

  serialize participants_ids, Array

Podemos serializar casi cualquier tipo de datos, pero deberemos en alguos casos intervenir como va a serializarlos. Podemos hacer uso de algunos serializadores predefinidos como el uso en este ejemplo de Array o podemos definir nuestro serializador.

Ejemplo de serializador de Fechas a valores to_datetime:

class ArrayDatesSerializer
  def self.load(values)
    values.nil? ? [] : values.split(',').map(&:to_datetime)
  end
  def self.dump(values)
    values.join(',')
  end
end

Sin queres mezclar mucha informacion sigamos.

(3)

Dado que ya tengo mi serializador que me guarda los participants_ids y tengo un metodo para ver cuales son esos ids con ese mismo nombre. Podemos agregar un metodo llamado participants que nos devuelva todos las instancias de esos participantes como si fuera una relacion normal en rails

def participants
  Participant.where(id: self.participants_ids)
end

Voy a ir mostrando algunas otras cosas en otras entregas de mi vuelta a rails.


Agustin Vinao
Agustin Vinao.

Paradox: Life is a mystery. Don't waste time trying to figure it out.
Humor: Keep a sense of humor, especially about yourself. It is a strength beyond all measure.
Change: Know that nothing stays the same.