Liste des posts

J’ai créé ma ressource pour les posts, maintenant il faut faire un lien vers l’index des posts sur la page d’accueil (de préférence). J’ouvre mon template index.html.erb et je mélange du HTML et du code Ruby :

<h1>Hello, Rails! Voici 29minparjour.</h1> 
<p><%= link_to "My Blog", posts_path %></p>

Le code Ruby est balisé par <% et %>. "My blog" est le nom de lien tel qu'il s'affiche dans ma page, et "posts_path" est la destination.

Je tombe sur http://localhost:3000/posts. Cette page d'index a été générée par le scaffold. Je peux créer un nouveau post, les afficher, les éditer, les supprimer. Tout est déjà prêt. On dirait un surgelé Picard.

Le Model Post

La partie qui gère les données se trouve dans mon fichier app/models/posts.rb.

class Post < ActiveRecord::Base
end

C'est tout ? Et oui, c'est encore ce ActiveRecord. Le simple fait de faire hériter la classe Post de la classe ActiveRecord::Base permet d'avoir une relation entre la classe Post et la table posts dans ma base de données.

Un peu de validation

Pour l'instant, je suis le seul à créer des posts. Donc je sais comment faire (il m'arrive d'être sérieux). Mais imaginons un guignol qui veut poster. Que va-t-il faire ? Il va mal remplir les champs! C'est évident. Je vais lui mettre des batons dans les roues, enfin dans son clavier. Je vais empêcher la création d'un post si ce dernier n'est pas conforme à mes règles :

class Post < ActiveRecord::Base
validates_presence_of :name, :title
validates_length_of :title, :minimum => 5
end

Inutile d'en dire davantage : il faut un nom et un titre, et le titre doit faire 5 caractères au moins. Il faudrait que je trouve la liste des tests de ce type que l'on peut effectuer pour la validation. Je l'ai pas trouvé dans la doc sur ActiveRecord::Base.

Avec la console

Soyons fous : je vais me passer du GUI et créer mes posts en ligne de commande, avec du Ruby. Je lance ma console :

script/console

Mes posts sont des objets (merci ActiveRecord), alors hop, j'en crée un nouveau :

p = Post.create(:name => "RubyMan", :title => "wizz", :content => "A new post")

Ok j'ai mon objet. Mais c'est juste un objet temporaire. Je veux le sauvegarder.

p.save # false

Bouh, je peux pas! Pourquoi il me met false? J'aimerais bien le savoir.

p.errors
#<ActiveRecord::Errors:0xb77e694c @errors={"title"=>["is too short (minimum is 5 characters)"]}, @base=#<Post id: nil, name: "RubyMan", title: "wizz", content: "Mon super post d'avant-centre", created_at: nil, updated_at: nil>>

Ah ok, mon titre est trop court. Et bien je te rajoute un "z" si t'es pas content!

p = Post.create(:name => "RubyMan", :title => "wizzz", :content => "A new post")
p.save #true