• 20 hours
  • Medium

Free online content available in this course.

course.header.alt.is_certifying

Got it!

Last updated on 1/17/17

Réutilisez vos vues

Log in or subscribe for free to enjoy all this course has to offer!

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.

Example of certificate of achievement
Example of certificate of achievement