Categorías
Desarrollo Ruby on Rails

Aventuras sobre rieles – Parte 6

En esta ocasión veremos dos temas poco relacionados entre sí, pero no por eso menos importantes:

  • Cómo agregar enlaces
  • Cómo agregar validaciones en el modelo

Agregando enlaces

Una vez visto lo anterior, listar los artículos es relativamente sencillo. Desde rails routes podemos ver que GET /articles es la ruta que debería darnos la lista de artículos y utiliza la acción index del controlador Articles. De modo que en app/controllers/articles_controller.rb agregamos:

def index
  @articles = Article.all
end

Eso va a renderizar la vista /app/views/articles/index.html.erb, la cual podemos resumir en:

<ul>
  <% @articles.each do |article| %>
    <li><%= article.title %>: <%= article.text %>
  <% end %>
</ul>

Por supuesto, esto es una simplificación exagerada de cómo se mostraría la lista, pero allí están todos los elementos y pueden acomodarse para que se vean tan lindos y útiles como uno quiera.

Ya tenemos una forma de crear nuevos artículos, listarlos y mostrarlos. Sin embargo todos los enlaces están disociados entres sí. Para que sea una aplicación más «navegable» agreguemos enlaces. Para esto utilizaremos el helper link_to que crea un elemento anchor en la vista:

<!-- /app/views/welcome/index.html.erb -->
<h1>Bienevenido</h1>
<%= link_to 'Mi blog', controller: 'articles' %>

<!-- /app/views/articles/index.html.erb
     Al principio -->
<%= link_to 'New article', new_article_path %>

<!-- /app/views/articles/new.html.erb
   y /app/views/articles/show.html.erb
     Al final -->
<%= link_to 'Back', articles_path %>

Como en el primer caso, si estamos en otro controlador es necesario especificar el controlador de destino.

Agregando validaciones

El modelo Article se encuentra declarado en /app/models/article.rb y es lo más simple que un modelo puede ser:

class Article < ApplicationRecord
end

Basicamente es una clase que hereda de ApplicationRecord (declarada en /app/models/application_record.rb) y que a su vez hereda de ActiveRecord::Base. Esta clase de por sí da muchísima funcionalidad CRUD, validación, búsquedas y la posibilidad de relacionar múltiples modelos entre sí. Podemos fácilmente agregar validación al modelo utilizando el método helper validates:

class Article < ApplicationRecord
  validates :title, presence: true, length: { minimum: 5 }
end

Ahora al realizar @article.save la grabación podría fallar por no cumplirse las validaciones, con lo cual el método retornaría false. Tendremos que ajustar entonces los métodos new y create del controlador para volver a mostrar el formulario en caso de ocurrir un problema al grabar. El método create es evidente: para poder verificar el resultado de la grabación y actuar en consecuencia. El método new simplemente porque utilizaremos la vista del formulario para mostrar los errores ocurridos y, por lo tanto, toda acción que renderice la vista new debe pasar todas las variables necesarias. Viendo el código será más evidente:

def new
  @article = Article.new
end

def create
  @article = Article.new(params.require(:article)
                               .permit(:title, :text))
  if @article.save
    redirect_to @article
  else
    render 'new'
  end
end

Si ejecutamos la aplicación e intentamos grabar un artículo sin título, por ejemplo, veremos que nos vuelve a mostrar el artículo. La validación funciona! Pero el usuario no tiene idea de lo que sucedió, por lo tanto debemos agregar en la vista del formulario un apartado para mostrar el error ocurrido, si ese es el caso:

<% if @article.errors.any? %>
  <div id="error_explanation">
    <h2>
      <%= pluralize(@article.errors.count, 'error') %>
       prohibited this article from being saved:
    </h2>
    <ul>
      <% @article.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
  </div>
<% end %>

El código (insertado dentro del formulario /app/views/articles/new.html.erb) permite mostrar los errores en caso de que existan y explica porque debemos crear la variable de instancia @article en la acción new.

Si ahora volvemos a intentar grabar el formulario nos indicará los errores. Tener en cuenta que rails envuelve los campos con errores en etiquetas DIV con la clase field_with_errors, con lo que podemos ajustar nuestras hojas de estilo para resaltarlos.

Deja una respuesta

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