• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 17/01/2017

Réutilisez vos vues

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Vous avez un formulaire de modification avec des messages d’erreur et de réussite : il serait intéressant de faire de même pour la création. Plutôt que de dupliquer du code, il existe un moyen de partager du HTML. Démonstration :

# app/views/books/_exemple.html.erb
<p>Ceci est un exemple</p>
# app/views/books/index.html.erb
<%= render "books/exemple" %>
<h1>Liste des livres</h1>

Et là, "Ceci est un exemple" apparaît sur l’index. Notez le underscore devant le nom de fichier _exemple.html.erb : on dit que c’est un partial, ou vue partielle. Une fois cela compris, effacez le fichier _exemple.html.erb et la ligne <%= render "books/exemple" %>  ajoutée dans l'index.

Déplacez le formulaire de modification dans un partial :

# app/views/books/_form.html.erb
<%= form_tag "/books/#{@book.id}", method: "patch" do %>
  <input type="text" name="title" value="<%= @book.title %>" />
  <p><%= @book.errors[:title].first %></p>
  <input type="submit" value="Modifier le livre" />
<% end %>
# app/views/books/show.html.erb
<h1><%= @book.title %></h1>
<%= render "books/form" %>
<%= form_tag "/books/#{@book.id}", method: "delete" do %>
  <input type="submit" value="Supprimer le livre" />
<% end %>
<p><a href="/books">Retourner à l’index</a></p>

Vérifiez que tout fonctionne toujours. Le formulaire de modification et de création ne sont pas exactement les mêmes. C’est gênant, car on ne peut de ce fait pas utiliser tel quel le partial. Il faut le rendre plus générique, pour que le même formulaire fonctionne aussi bien pour la création que la modification. Essayez ce code :

# app/views/books/_form.html.erb
<%= form_for @book do %>
  <input type="text" name="title" value="<%= @book.title %>" />
  <p><%= @book.errors[:title].first %></p>
  <input type="submit" value="Modifier le livre" />
<% end %>

Les nouvelles routes du chapitre précédent offrent de nouveaux helpers, dont  form_for. C’est un form_tag  alternatif : à partir de @book, il déduit tout seul la route et la method à utiliser. Ici, /books/:id  et patch. Si @book avait pour valeur Book.new, la route serait /books et la method serait post.

Est-ce que vous pouvez deviner les modifications à faire pour que ce partial fonctionne pour la création d’un livre ?

# app/controllers/books_controller.rb
def index
  @books = Book.all
  @book = Book.new # afin d'exploiter le helper form_for
end
# app/views/books/index.html.erb
<h1>Liste des livres</h1>
<% @books.each do |book| %>
  <p><a href="/books/<%= book.id %>"><%= book.title %></a></p>
<% end %>
<%= render "books/form" %>

Testez : la création doit marcher !

# app/views/books/_form.html.erb
<%= form_for @book do %>
  <input type="text" name="title" value="<%= @book.title %>" />
  <p><%= @book.errors[:title].first %></p>
  <% if @book.persisted? %>
    <input type="submit" value="Modifier le livre" />
  <% else %>
    <input type="submit" value="Ajouter le livre" />
  <% end %>
<% end %>

J’en profite pour vous présenter une nouvelle fonction : persisted?, avec son point d’interrogation. @book.persisted? vaut true si le livre est déjà en base de donnée et false sinon. C’est un bon moyen de savoir si nous sommes en train de créer ou modifier un livre.

Testez la création avec un titre vide ou déjà pris. Comme souhaité, la création ne se fera pas, mais les messages d’erreurs n’apparaîtront pas. Il faut mettre à jour votre controller :

# app/controllers/books_controller.rb
def create
  @book = Book.new title: params[:title]
  if @book.save
    flash[:success] = "Le livre a bien été créé."
    redirect_to "/books"
  else
    @books = Book.all
    render "index"
  end
end

Avez-vous compris pourquoi j’ai fait ces modifications dans le controller ?

C’est exactement le même principe que pour la modification : si la sauvegarde fonctionne alors on redirige, sinon on reste sur la page pour afficher les erreurs. L’index ayant besoin de @books, il ne faut pas oublier de l’ajouter.

Exemple de certificat de réussite
Exemple de certificat de réussite