Retour à Rails après un interlude Ruby/Twitter.

En fait, il y a 2 étapes pour créer un nouveau post :

  1. Il faut d’abord appeler la méthode new qui crée un objet Post
  2. puis il faut appeler la méthode create qui va récupérer les infos du formulaire et sauvegarder l’objet dans la base de données.

New post

En allant sur http://localhost:3000/posts/new, je crée un objet Post (vide pour l’instant). La méthode new est dans mon Controller :

  def new
    @post = Post.new
 
    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @post }
    end
  end

Cette méthode est appelée en allant sur mon View qui se trouve dans app/view/posts/new.html.erb :

<h1>New post</h1>
 
<% form_for(@post) do |f| %>
  <%= f.error_messages %>
 
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </p>
  <p>
    <%= f.label :content %><br />
    <%= f.text_area :content %>
  </p>
  <p>
    <%= f.submit 'Create' %>
  </p>
<% end %>
 
<%= link_to 'Back', posts_path %>

Un fichier de template erb qui me crée un formulaire pour mon objet avec les différents inputs de texte correspondants chacun à un attribut de mon objet.

Pour l’instant, en remplissant le champ, je prépare mon objet à appeler la méthode create. Cette méthode est appelée quand je cliquerai sur le bouton de submission.

Create post

Je clique sur le bouton “Create”, et là j’appelle la méthode create.

  def create
    @post = Post.new(params[:post])
 
    respond_to do |format|
      if @post.save
        flash[:notice] = 'Post was successfully created.'
        format.html { redirect_to(@post) }
        format.xml  { render :xml => @post, :status => :created, :location => @post }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
      end
    end
  end

Si la sauvegarde se passe bien, j’ai une notification “‘Post was successfully created.” et je suis redirigé vers l’affichage du post en question.
Sinon, je reste sur la page “new” et j’ai l’affichage des erreurs.