Categorías
Desarrollo Ruby on Rails

Aventuras sobre rieles – Parte 4

En esta parte vamos a comenzar a agregar artículos. La primer magia de rails la haremos agregando en /config/routes.rb la siguiente línea entre la de get y la de root:

resources :articles

Esta sola línea genera todas las rutas necesarias para alta, baja, borrado y modificación de artículos. Si ejecutamos rails routes veremos las siguientes rutas nuevas:

Prefix Verb   URI    Pattern                      Controller#Action
     articles GET    /articles(.:format)          articles#index
              POST   /articles(.:format)          articles#create
  new_article GET    /articles/new(.:format)      articles#new
 edit_article GET    /articles/:id/edit(.:format) articles#edit
      article GET    /articles/:id(.:format)      articles#show
              PATCH  /articles/:id(.:format)      articles#update
              PUT    /articles/:id(.:format)      articles#update
              DELETE /articles/:id(.:format)      articles#destroy

Sin embargo, esas rutas precisan aún el controlador articles y las rutas index, create, new, edit, show y update. Con lo cual, tal como hicimos con Welcome, debemos hacer:

$ rails generate controller Articles

Con esto ya tenemos el controlador, pero si vemos el código creado (recordemos, en /app/controllers/articles_controller.rb) observaremos que no tiene ninguna acción (no indicamos ninguna en el comando). Recordemos que para que todo funcione necesitamos una acción y una vista.

Agreguemos la acción new:

class ArticlesController < ApplicationController
  def new
  end
end

ejecutemos el servidor y vayamos a localhost:3000/articles/new, veremos el siguiente error:

Como vemos, falta la plantilla, es decir: la vista. Por defecto, rails está buscando en app/views y, por convención, está buscan la plantilla articles/new (controller/action) con la extensión .html.erb (.html es el formato buscado y .erb es el manejador utilizado para procesar ese formato). Por lo tanto, crearemos el archivo /app/views/articles/new.html.erb:

<h1>Nuevo Artículo</h1>

Si refrescamos la página veremos un título… un aburrido título por cierto. Agreguemos un formulario y escribamos algo de código ERB en el proceso:

<%= form_with scope: :article, local: true do |form| %>
  <p>
    <%= form.label :title %><br>
    <%= form.text_field :title %>
  </p>
 
  <p>
    <%= form.label :text %><br>
    <%= form.text_area :text %>
  </p>
 
  <p>
    <%= form.submit %>
  </p>
<% end %>

Nuevamente refrescamos la página veremos un formulario, así, sin más, tan simple como eso. Feo, sí, pero un formulario al fin.

Ahora tenemos que hacer una corrección, si miramos el html generado el atributo action del formulario apunta a POST /articles/new, sin embargo si vemos las rutas previstas para el recurso articles debería ser POST /articles, la cual apunta a la acción create del controlador articles:

Prefix Verb   URI    Pattern                      Controller#Action
     articles POST   /articles(.:format)          articles#create

Este ajuste lo hacemos agregando explícitamente el destino del formulario en la definición de form_with:

<%= form_with scope: :article, url: articles_path, local: true do |form| %>

¿Pero que es articles_path? Bien, si vamos a localhost:3000/rails/info/routes veremos que para cada ruta hay un nombre (helper) asociado. En particular articles_path está asociado a dos rutas, pero sólo una para el método POST: create.

Para probar si esto es así, simplemente recargamos la página y presionamos el botón «Enviar»:

Lo cual nos confirma que estamos accediendo exactamente a donde queremos.

form_with por defecto envía el formulario utilizando Ajax. local: true deshabilita esta característica para simplificar el ejemplo.

Creando artículos

El error anterior se evitar creando la acción create sin ningún contenido. Lo cual por sí solo en apariencia logrará que el formulario no haga nada, pero por detrás lo que ocurre es que rails devuelve un código 204 ya que no encuentra la vista o algo que le indique que respuesta brindar. Sin embargo, el formulario nos está enviando sus datos en el parámetro article, el cual podemos inspeccionar si incluimos la siguiente línea dentro del método create:

render plain: params[:article].inspect

inspect es un método aplicable a cualquier objeto y que devuelve una representación legible del mismo. Esto nos devuelve:

<ActionController::Parameters {"title"=>"Título del artículo", "text"=>"Cuerpo del mismo"} permitted: false>

Todavía no es muy útil, pero ya comenzamos a entender el ciclo de rails.

En el próximo artículo crearemos el módulo de los articles lo que nos va a permitir trabajar con persistencia y, por lo tanto, empezar a pensar en crear artículos con Ruby on Rails.

Deja una respuesta

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