Categorías
Desarrollo Ruby on Rails

Aventuras sobre rieles – Parte 5

Creando el modelo para los artículos

Llamamos «modelo» a la definición de la estructura de datos que albergará una determinada entidad, en este caso artículos. Los modelos en rails se definen en singular y su correspondiente tabla quedará en plural. Para generar el modelo para los artículos escribimos desde la línea de comandos:

$ rails generate model Article title:string text:text

Esto generará algunos archivos, de los cuales nos interesan:

/app/models/articles.rb
/app/db/migrate/20200928223642_create_articles.rb

Siendo el segundo de ellos el encargado de generar la estructura en la base de datos. Migrations son la forma de crear y mantener archivos que puedan generar la estructura de la base de datos y sus posteriores cambios. Si nos fijamos en el nombre nos da información de lo que hace y de la fecha en que fue creado. Inspeccionando el script vemos que se encuentra el método change el cual se ejecutará al iniciar las migrations. Este proceso es reversible, de modo que es posible deshacerlo de ser necesario.

Las migrations inician con el siguiente comando:

$ rails db:migrate

Pero, ¿que hizo? ¿y donde? Para determinar cual es el motor de base de datos rails revisa el archivo config/database.yml y utiliza la que se encuentre definida en la sección correspondiente al entorno de ejecución. En este caso estamos en development, de modo que utilizará el motor sqlite3 y creará la base de datos db/development.sqlite3.

Es posible ejecutar el comando para otro entorno diferente al actual pasándolo como parámetro:
rails db:migrate RAILS_ENV=production

Grabando datos

Ahora que tenemos nuestro modelo de persistencia podemos grabar el artículo utilizando el formulario ya creado. Recordemos que al grabar el formulario hace un request con el método POST a la acción create del controlador Articles. De modo que la acción a setear es create y será con el siguiente contenido:

def create
  @article = Article.new(params.require(:article)
                               .permit(:title, :text))

  @article.save
  redirect_to @article
end

Lo que hace este método es crear un nuevo artículo pasando como parámetro los valores que se asignarán a sus atributos (title y text). El método seguro que prevee rails es a partir de los parámetros (params) se indica que se requiere que exista article (:article), de no venir presente ocurrirá un error, y luego se indican (permit) los valores admitidos para la asignación (que podrían o no venir seteados). Esto queda almacenado en la variable de instancia @article, de la cual luego se ejecuta el método save, el cual persiste la información en la base de datos. Finalmente se redirige a la vista correspondiene al artículo (redirect_to @article llama implícitamente a la acción show pasando como parámetro el id del artículo recién creado).

Si volvemos al formulario, completamos los datos y grabamos encontraremos que los datos quedan efectivamente grabados en la base de datos y adicionalmente el siguiente error:

Esto es porque el método show no está creado aún.

Si repasamos las rutas, el formulario se encuentra en GET /articles/new. Al grabar estamos llamando a POST /articles que a su vez redirige a GET /articles/:id para mostrar el artículo recién creado. Para conocer la acción específica asociada a estas rutas basta ir a /rails/info desde el navegador o hacer rails routes desde la línea de comando. Veremos que la acción es show, precisamente como muestra el error, el cual recibe como parámetro el id del artículo. Podemos testear esto muy fácilmente si rápidamente escribimos show como:

def show
  render plain: params[:id]
end

Al grabar otro formulario no veremos el error anterior y en cambio veremos impreso el número de id recién generado. Pero, claro, eso no es lo que buscamos. Una línea más útil, e igualmente breve, sería:

def show
  @article = Article.find(params[:id])
end

Las variables de instancia automáticamente son visibles en las vistas, de modo que deberíamos escribir /app/views/articles/show.html.erb como sigue:

<p>
  <strong>Title:</strong>
  <%= @article.title %>
</p>
<p>
  <strong>Text:</strong>
  <%= @article.text %>
</p>

Y así, sencillamente, tenemos la grabación y la visualización del artículo. Es más, si ya hemos grabado varios artículos podemos modificar el número del id en la url y visualizar los artículos anteriores.

En el siguiente artículo veremos como listar los artículos ya creados.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *