• 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

Ajoutez un formulaire de création

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

Vous savez comment créer des données dans la console rails, vous savez comment afficher ces données sur une page web. Maintenant, voyons comment ajouter des données depuis cette page web.

Pour cela, il nous faut un formulaire sur notre page. Ce formulaire aura un champ texte pour le titre du livre, et un bouton « créer ».

Voici à quoi ressemblerait un formulaire classique en HTML pour notre situation :

<form action="/books" method="post">
  <input type="text" name="title" />
  <input type="submit" value="Ajouter le livre" />
</form>

Mais Rails a besoin de davantage d’éléments, notamment pour des raisons de sécurité. Afin que vous n’ayez pas à saisir tous ces éléments mystérieux à la main, Rails met à votre disposition un helper. Un helper est une fonction qui produit du HTML à votre place. Voici à quoi cela ressemble :

# app/views/books/index.html.erb
<%= form_tag "/books", method: "post" do %>
  <input type="text" name="title" />
  <input type="submit" value="Ajouter le livre" />
<% end %>

L’ouverture et la fermeture du formulaire ont changé, tout en gardant les éléments qui nous importent : les attributs html action et method se sont transformés en paramètres du helper form_tag.

La valeur « /books » de notre formulaire laisse penser que c’est la fonction index du BooksController qui va traiter nos données. En effet, nous avons une route qui dit cela :

get 'books' => 'books#index'

Avec les routes et les contrôleurs, il est possible de séparer dans deux fonctions différentes le traitement d’une page en fonction de si l’on arrive dessus avec get ou avec post. Concrètement, qu’est-ce que cela donne ?

# config/routes.rb
get 'books' => 'books#index'
post 'books' => 'books#create'
# app/controllers/books_controller.rb
class BooksController < ApplicationController
  def index
    @books = Book.all
  end

  def create
    # ...
  end
end

Voilà : quand nous cliquons sur le bouton « Ajouter le livre », c’est le code de la fonction create de BooksController qui sera exécuté.

Que mettre dans la fonction create ? Si vous avez bien suivi, vous vous doutez qu’il y aura, au choix, un Book.new ou un Book.create. Mais il vous manque une information : comment récupérer ce que l’utilisateur a saisi dans le formulaire ?

La réponse est la suivante : la variable params. C’est une variable de type Hash dont les clés coïncident avec les attributs name du formulaire, et les valeurs sont les saisies de l’utilisateur. Par exemple : params[:title].

Bien ! Nous avons tout ce qu’il nous faut pour remplir notre fonction create :

def create
  Book.create title: params[:title]
end

Est-ce qu’il faut créer une nouvelle vue pour cette fonction ? A priori, oui… mais cette vue serait exactement la même que l’index. Il ne serait pas très élégant de dupliquer le code de la vue. Je vous présente une astuce : la redirection. Une redirection permet de rediriger le navigateur vers une autre route. Par exemple :

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

Et hop ! Juste après la création du livre, le navigateur retournera sur http://localhost:3000/books, dont la route vous emmènera dans la fonction index, qui affichera la bonne vue.

Voici un récapitulatif du contrôleur :

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

Ajoutez quelques livres avec votre formulaire fraîchement réalisé :)

Essayez de changer le Book.create par un Book.new en faisant en sorte que l’ajout de livre fonctionne toujours aussi bien. L’un n’est pas mieux que l’autre, c’est une question de goût.

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