• 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

Modifiez vos données

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

Vous avez déjà tout en main pour modifier des données. Mais ça demande de l’organisation et la peinture est encore fraîche. Alors faisons cela ensemble !

La première étape est de faire une nouvelle vue, qui permette d’afficher un livre en particulier. Sur cette vue, nous mettrons plus tard un formulaire de modification. Quelle est la route d’un livre ? Vraisemblablement, elle sera différente pour chaque livre. Par exemple /books/1 pour le livre dont l’identifiant (attribut « id ») est 1. Voici la syntaxe nécessaire dans config/routes :

get 'books/:id' => 'books#show'

Le « :id » permet de stocker la fin de la route dans params[:id]. Ce sera la fonction show du BooksController qui sera exécutée. Tout comme il est habituel d’appeler « index » la fonction qui liste tous les éléments, il est habituel d’appeler « show » la fonction qui n’en affiche qu’un seul.

À partir de là, tout se déroule comme vu avant. Dans le BooksController :

def show
  @book = Book.find(params[:id])
end

Et dans la vue, n’affichez que le titre du livre et un lien pour revenir à l’index :

# app/views/books/show.html.erb
<h1><%= @book.title %></h1>
<p><a href="/books">Retourner à l’index</a></p>

Nous allons modifier l’index afin de faire des liens vers chaque livre :

# 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 %>

Relancez votre serveur, allez sur http://localhost:3000/books et testez les différents liens. Les liens HTML que nous avons construits n’ont rien de particulier : nous reprenons simplement les routes existantes. Notez comme l’identifiant du livre est incrusté dans chaque lien, sur l’index.

Bien ! Les préparatifs sont terminés. À partir de là, tout va beaucoup ressembler à l’ajout de livre. Ajoutez un formulaire de modification dans la vue :

# app/views/books/show.html.erb
<h1><%= @book.title %></h1>

<%= form_tag "/books/#{@book.id}", method: "patch" do %>
  <input type="text" name="title" value="<%= @book.title %>" />
  <input type="submit" value="Modifier le livre" />
<% end %>

<p><a href="/books">Retourner à l’index</a></p>

Plusieurs choses ont changé par rapport à notre premier formulaire :

  • l’adresse n’est plus /books mais /books/1 (si l’id du livre est 1), car nous modifions un livre spécifique. Notez le #{@book.id}, qui permet d’inclure une variable à l’intérieur d’une chaîne de caractères ;

  • la method est patch, utilisée pour modifier des données, alors que post est utilisé pour la création de données ;

  • nous renseignons le champ texte avec le titre actuel du livre.

Dans config/routes.rb, nous ajoutons :

patch 'books/:id' => 'books#update'

Si « create » est le nom habituel donné à la fonction de création, « update » est utilisé pour la mise à jour. Techniquement, nous pouvons mettre n’importe quoi. Mais respectons les habitudes des développeurs :)

Enfin, ajoutez cette fonction dans le BooksController :

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

Comme pour la création, il y a un raccourci pour mettre à jour directement un élément sans passer par le save, avec la fonction « update ». Comme pour la création, nous faisons une redirection pour revenir à la page d’affichage du livre.

Récapitulatif pour les routes et le contrôleur :

# config/routes.rb
Rails.application.routes.draw do
  get 'books' => 'books#index'
  post 'books' => 'books#create'
  get 'books/:id' => 'books#show'
  patch 'books/:id' => 'books#update'
end
# app/controllers/books_controller.rb
class BooksController < ApplicationController
  def index
    @books = Book.all
  end

  def create
    Book.create title: params[:title]
    redirect_to "/books"
  end

  def show
    @book = Book.find(params[:id])
  end

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

Voilà, vous n’avez plus qu’à tout tester :)

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