Partials

Si te fijas, en nuestro proyecto el formulario de crear y editar un libro tienen código que estamos duplicando. Podemos extraer el código que se repite en un archivo a parte, llamado un partial, y referenciarlo desde los dos formularios.

Puedes continuar con la aplicación que desplegaste en el capítulo anterior o puedes clonar nuevamente el proyecto y ubicarte en la rama de este capítulo ejecutando los siguientes comandos:

$ git clone https://github.com/makeitrealcamp/books-app.git
$ cd books-app
$ git checkout step-9

Crea un archivo llamado _form.html.erb (el _ es importante para que Rails lo reconozca como un partial) dentro de la carpeta app/views/books/ con el mismo contenido que tiene el archivo new.html.rb en la misma carpeta:

<div class="container">
  <div class="row justify-content-center">
    <div class="col-sm-6">
      <div class="card mt-5">
        <div class="card-header font-weight-bold">Agregar Libro</div>
        <%= form_for @book do |f| %>
        <div class="card-body">
          <div class="form-group">
            <%= f.label :title %>
            <%= f.text_field :title, class: "form-control", autofocus: true %>
          </div>
          <div class="form-group">
            <%= f.label :author %>
            <%= f.text_field :author, class: "form-control" %>
          </div>
          <div class="form-group">
            <%= f.label :description %>
            <%= f.text_area :description, rows: 4, class: "form-control" %>
          </div>
          <div class="form-group">
            <%= f.label :image_url %>
            <%= f.url_field :image_url, class: "form-control" %>
          </div>
          <div class="form-group">
            <%= f.label :publication_date %>
            <%= f.date_field :publication_date, class: "form-control" %>
          </div>
          <div class="form-group">
            <%= f.label :price %>
            <%= f.number_field :price, class: "form-control", step: :any %>
          </div>

        </div>
        <div class="card-footer text-right">
          <%= link_to "Cancelar", books_path, class: "btn btn-default" %>
          <%= f.submit class: "btn btn-primary" %>
        </div>
        <% end %>
      </div>
    </div>
  </div>
</div>

Ahora, reemplaza el contenido de new.html.erb y edit.html.erb con la siguiente línea:

<%= render "form" >

Eso es todo. Fíjate que, en el método render, utilizamos "form" en vez de "_form", Rails ya sabe que este archivo es un partial y debe comenzar con _.

El problema es que el título de los dos formularios es ahora Agregar Libro. Pero al editar queremos cambiarlo por Editar Libro. No hay problema, podemos pasarle variables al partial.

Modifica la siguiente línea del partial:

<div class="card-header font-weight-bold">Agregar Libro</div>

por la siguiente:

<div class="card-header font-weight-bold"><%= title %></div>

En new.html.erb modifica la única línea que existe por:

<%= render "form", title: "Agregar Libro" >

En edit.html.erb modifica la única línea que existe por:

<%= render "form", title: "Editar Libro" >

Verifica que el título al crear un libro sea Agregar Libro y al editar sea Editar Libro.

Last updated