Rails

Altoros participó de la RubyConf Argentina 2013

Durante tres días, del 26 al 28 de noviembre, profesionales amantes de Ruby se dieron cita en Ciudad Cultural Konex (Ciudad Autónoma de Buenos Aires, Argentina) para asistir al encuentro de rubystas más grande de Latinoamérica. Una vez más, Altoros Argentina dijo presente.

Allí, nuestros compañeros aprovecharon la oportunidad para divertirse pero también intercambiar conocimientos y experiencias con colegas.

Sin-título-2

Durante la primera jornada, en el llamado Ruby Fan Day, Joaquín Vicente y Luis López brindaron una taller de “Introducción a Ruby on Rails” donde explicaron cómo crear aplicaciones web con el framework Rails.

Luis (luigibyte) es programador e inline skater. Llegó al mundo de la programación de la mano de Ruby y desde entonces no ha prestado mucha atención a otros lenguajes. A lo largo de su carrera se ha encontrado con mucha y muy buena gente que le ha enseñado y entiende que este taller es una buena oportunidad de devolver algo de todo eso. Dicen que el último paso para comprender algo es poder enseñarlo y ése es su objetivo.

Joaquín aprendió de chico a programar en Basic para poder hackear el juego de la viborita del DOS. Desde entonces se dio cuenta que la programación era lo suyo. Recorrió una larga variedad de lenguajes hasta que conoció Ruby. Dice que fue amor a primera vista. Le gusta aprender y enseñar cosas nuevas todo el tiempo. Cuando no programa le encanta viajar, aunque cada tanto extraña Buenos Aires. Sueña con llevar su “oficina” en una casa rodante alrededor del mundo.

Qué es el Ruby Fun Day

El Ruby Fun Day se desarrolla durante el primer día de la RubyConf y está pensado para que cada uno traiga su laptop, o se junte con aquellos que la traigan, para poder hacer juegos y talleres.

Participantes de RubyConf Argentina 2013

Foto por: RubyConf Argentina

AJAX en Rails

En un post anterior hablé un poco de cómo se siente codear en Coffeescript. Este pequeño tutorial trata acerca de los puntos básicos a la hora de hacer AJAX en Rails . Esta vez voy a usar un clásico: una aplicación de microblogging con soporte para crear blog posts y consideraré una función asincrónica para votarlos.

$ rm public/index.html
$ rake db:create
$ rails g resource post title:string name:string votes:integer
$ rake db:migrate

Ya tenemos una base en la que trabajar. Hay muchas maneras de lidiar con votos. Podés elegir usar un modelo para poder mantener seguimiento de los votos de un usuario, agregar la capacidad de remover un voto, limitar la cantidad de veces que un usuario puede votar en un misma acción de votación, etc. Pero voy a usar la forma más simple: una columna votes de la tabla Posts. Recomiendo usar ActiveRecord::Counter para actualizar el campo votes.

# app/controllers/posts_controller.rb
class PostsController < ApplicationController
  respond_to :html, :json

  def index
    respond_with @posts = Post.all
  end

  def vote_up
    @post = Post.find(params[:id])
    if @post.increment! :votes
      respond_with @post do |format|
        format.html { redirect :back }
      end
    end
  end
end

Vamos a necesitar agregar algunas rutas:

# config/routes.rb
MyBloggingApp::Application.routes.draw do
  root to: 'posts#index'
  resources :posts do
    member { post :vote_up }
  end
end

Y debajo tenemos una vista básica:

# app/views/posts/index.haml
.posts
  %h1 Listing posts

  - @posts.each do |post|
    %hr
    .post
      %legend
        = post.title
        %small{id: "#{post.id}_votes"}
          Votes: 
          = post.votes
      = link_to 'Vote_up', vote_up_post_path(post), class: 'vote_up', 'data-method' => :put, id: post.id
      = post.body.html_safe

Aqui tenemos un retazo de JS (Coffeescript) para implementar la votación asincrónica. Estamos enlazando la llamada AJAX al evento ‘click’ del botón para votar. Si el JS es desactivado o se encuentra un error de runtime, el boton va degradar de forma transparente a la acción html: votar y redirigir de vuelta.

# app/assets/posts.js.coffee
$ ->
  $('.post a.vote_up').click (ev)->
    ev.stopImmediatePropagation()
    ev.preventDefault() # If the javascript is enabled prevent default event (navigation)
    id = @id
    $.ajax
      url: "/posts/#{id}/vote_up.json",
      type: 'POST',
      complete: (data)-> # Update the 'Votes: X' field on success 
        post = JSON.parse(data.responseText)
        $("small##{id}_votes").text("Votes: #{post.votes}")

Si querés pegar una ojeada el código fuente para esta app se encuentra acá.
Más Info
jQuery.ajax() docs
David Parker’s blog post on Rails respond_to