• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 23/10/2018

Exploitez les messages d’erreur

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

Il est agréable, quand on valide un formulaire incorrect, que les erreurs s’affichent sous les champs concernés avec le bon message. Pour ce faire, utilisez les erreurs dans votre page de modification d’un livre :

# app/views/books/show.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 %>

Tout simplement ! Mais il reste un problème. Observez le code du contrôleur :

#app/controllers/books_controller.rb
def show
  @book = Book.find(params[:id])
end

def update
  Book.find(params[:id]).update title: params[:title]
  redirect_to "/books/#{params[:id]}"
end

Si le titre est vide, l’update va échouer et remplir les erreurs du livre. Puis vous êtes redirigé vers le show, ce qui détruit le travail en cours sur le livre. Pour pallier ce problème, il ne faut plus de redirection quand la sauvegarde échoue. Voici comment gérer la situation :

def update
  @book = Book.find(params[:id])
  if @book.update title: params[:title]
    redirect_to "/books/#{params[:id]}"
  else
    render 'show'
  end
end

Si l’update se passe bien, vous serez redirigé comme avant. Et sinon, le code appelle la vue de « show ». Pour que la vue de show fonctionne, elle a besoin de la variable @book, c’est pourquoi elle est là.

Dans la fonction update, ne pourrions-nous pas tout le temps faire render 'show' ? La réponse est oui, cela fonctionnerait. Mais je déconseille cette pratique. Juste après la modification réussie d’un livre, actualisez la page de votre navigateur. Faites la même expérience en remplaçant la redirection par un render 'show'. Je vous laisse la surprise :)

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