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/consoleMes 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
Flux RSS
Tu cherches sans doute ça : http://guides.rubyonrails.org/activerecord_validations_callbacks.html#validation-helpers
Etrange j’ai posté un commentaire ce matin, avec un exemple et tout et tout… Il a pas du passer, peut-être le script dans le comm….
toujours est-il que la doc que tu recherches, se trouve dans ActiveRecord::Validations et non dans Base, c’est pour ça que tu la voyais pas… En plus du lien de Briice (salut Brice
), qui en fait est assez explicite, j’avais mis dans mon exemple une façon de faire ton propre validateur.
Tant pis