Freivin Campbell

Mi primer API con Ruby on Rails

20 de marzo del 2017 | 16 Minutos leyendo

Un API es un servicio que facilita la creación de servicios HTTP disponibles para una amplia variedad de clientes, entre los que se incluyen exploradores y dispositivos móviles. Rails es la plataforma perfecta para crear aplicaciones RESTful de una manera fácil, rápida y sin olvidar sencilla.

Comencemos

Con la llegada de Rails 5 la vida para los amantes del API se volvió más sencilla, este maravilloso framework nos ofrece en su nueva versión una manera aún más sencilla para la creación de API´s, ahora con un solo comando tendremos la estructura para nuestro BACK-END.

Para instalar ruby on rails en tu equipo aqui te dejo un tutorial para que puedan instalarlo esta escrito para la versión 4.2.6 el unico detalle seria cambiar la versión por la actual de rails, adjunto el link de rails para que vean la versión final: rubyonrails.org

Instalar Rails en Ubuntu

Ubuntu

Instalar Rails en Windows

Windows

Para los que ya tienen ruby instalado, instalar Rails en su versión 5 debemos correr el siguiente comando:

gem install rails -v 5.0.2

Al finalizar la instalación tenemos nuestro framework completamente preparado para el uso de API’s así que corremos:

rails -v

y corroboramos que esté instalada la versión de rails correspondiente

Perfecto Rails es tan versátil que con un solo comando creará la estructura correspondiente para un proyecto y además quedará listo para usarlo al 100% como un API. en la terminal nos colocamos donde crearemos el proyecto y escribimos:

rails new [nombre del proyecto] --api

Listo, con ello podremos abrir el proyecto con nuestro editor de texto favorito. Para crear un CRUD de libros Rails nos ayuda con el scaffold así que en nuestra terminal posicionados en la carpeta de nuestra API corremos el siguiente comando:

rails generate scaffold book title author synopsis year

Debemos recordar que cuando se generan migraciones, modelos y scaffold, si los atributos van en blanco el asume que son de tipo string así que para el ejemplo únicamente escribiremos: el título del libro, el autor, la sinopsis y por último el año del libro.

Le damos enter y Rails hará su MAGIA, nos creará la migración para la base de datos, el modelos de los libros, el controlador, y los test para el mismo.

Running via Spring preloader in process 26563
      invoke  active_record
      create    db/migrate/20170326180203_create_books.rb
      create    app/models/book.rb
      invoke    test_unit
      create      test/models/book_test.rb
      create      test/fixtures/books.yml
      invoke  resource_route
       route    resources :books
      invoke  scaffold_controller
      create    app/controllers/books_controller.rb
      invoke    test_unit
      create      test/controllers/books_controller_test.rb

Antes de correr y generar nuestra tabla podemos revisar nuestra migración y asegurarnos que todo esté bien, revisamos el archivo que se encuentra en db/migrate/[fecha y nombre de la migración] nos indica lo siguiente

Creación de una tabla llamada libros la cual contiene título, autor, sinopsis y año.

class CreateBooks < ActiveRecord::Migration[5.0]
  def change
    create_table :books do |t|
      t.string :title
      t.string :author
      t.string :synopsis
      t.string :year

      t.timestamps
    end
  end
end

Con ello podremos correr la migración con el siguiente comando:

rails db:migrate

Por el momento estamos usando la base de datos por defecto sqlite3 así que no hay que pensar mucho en eso.

== 20170326180203 CreateBooks: migrating ======================================
-- create_table(:books)
   -> 0.0024s
== 20170326180203 CreateBooks: migrated (0.0025s) =============================

Si entramos en nuestra consola de rails con el comando:

rails console

escribimos

Book.all

nos deberá retornar un select * from books de la base de datos y en nulo ya que no creamos libros aun.

SELECT "books".* FROM "books"

Podemos echarle un vistazo a nuestro controlador de libros ubicado en app/controllers/books_controller.rb en él podemos encontrar los métodos CRUD ya escritos y funcionales en el.

class BooksController < ApplicationController
  before_action :set_book, only: [:show, :update, :destroy]

  # GET /books
  def index
    @books = Book.all

    render json: @books
  end

  # GET /books/1
  def show
    render json: @book
  end

  # POST /books
  def create
    @book = Book.new(book_params)

    if @book.save
      render json: @book, status: :created, location: @book
    else
      render json: @book.errors, status: :unprocessable_entity
    end
  end

  # PATCH/PUT /books/1
  def update
    if @book.update(book_params)
      render json: @book
    else
      render json: @book.errors, status: :unprocessable_entity
    end
  end

  # DELETE /books/1
  def destroy
    @book.destroy
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_book
      @book = Book.find(params[:id])
    end

    # Only allow a trusted parameter "white list" through.
    def book_params
      params.require(:book).permit(:title, :author, :synopsis, :year)
    end
end

Probemos su funcionamiento; para mi persona recomiendo usar postman para probar las peticiones HTTP, lo pueden descargar de aquí. Es muy sencillo de utilizar.

Recordemos encender el server de rails con un:

rails s  

Colocamos el tipo de petición en el caso de crear necesitamos un POST, escribimos la url a la cual mandaremos la petición y cambiamos la opción que dice text por la opción que dice JSON (application/json)

Debería de verse algo así:

Escribimos el cuerpo del mensaje en formato json y luego de ello presionamos el botón send y postman deberá regresarnos un código 201 de creado y el objeto en un json

Si no conoce las url de tu proyecto en la terminal escribiendo el siguiente comando nos mostrara la estructura de cada una de las rutas de nuestro proyecto

rails routes
Prefix Verb   URI Pattern          Controller#Action
 books GET    /books(.:format)     books#index
       POST   /books(.:format)     books#create
  book GET    /books/:id(.:format) books#show
       PATCH  /books/:id(.:format) books#update
       PUT    /books/:id(.:format) books#update
       DELETE /books/:id(.:format) books#destroy

Para saber cuántos libros posee la base de datos al cambiar post pot get realizará un select a la base de datos y nos retornara lo que encuentre :

El código de regreso ya no es un 201 sino un 200 cual es correspondiente si un get fue realizado con éxito.

Despedida

Seria todo, con esto terminamos, si tienen alguna pregunta, duda o comentario no duden en escribirme acá abajo. Nos vemos en el siguiente POST

Espero que hayas aprendido algo nuevo y útil. :smile: