Il y a des jours comme ça… Je n’ai jamais fait autant de Rails (ou plutôt essayé d’en faire) qu’aujourd’hui. J’avais une idée en tête : faire en Rails l’outil Twitter que j’avais fait en Ruby pur et dur. Pourquoi ne pas le garder en Ruby ? En fait, je voulais profiter de l’interface de Rails, notamment le View et l’AJAX. Je me suis dit que ça allait être facile, vu que le code Ruby était assez simple. Et ben… j’ai galéré grave (et j’ai pas réussi encore).

Je veux le faire à ma façon!

Avec tout le scaffolding et les conventions à respecter, j’ai surtout été spectateur que acteur pour l’instant avec Rails. Hop, un script, ça me génère quasiment tout. Je n’ai plus qu’à rajouter quelques détails et ça marche. C’est un peu le but vous me direz. Un framework c’est fait pour ça. Passer moins de temps à coder, et davantage à produire.

Le problème, c’est que dès que je veux sortir de la route et prendre mon chemin, et bien je ne sais pas comment faire. Là je veux mettre mon code pour Twitter dans un Controller et l’afficher dans un View. Mais quel lien entre mon Controller et mon View ?

Je regarde mes fichiers pour l’appli blog, j’ouvre mon Controller Post et mes View de Post (index,show,new…). Je vois du @post partout, et des <%. Là, mon @post, il vient de mon Model. Par exemple :

@post = Post.new

Mais là, je veux pas utiliser de Model, je ne sauvegarde rien dans ma base de données pour mon appli Twitter. Je veux juste un Controller, où je vais générer des objets, et je veux ensuite afficher mes objets dans le View.

Comment il marche le Post pour l’instant ?

La méthode show par exemple : http://localhost:3000/posts/2.

Controller

# GET /posts/1
# GET /posts/1.xml
def show
@post = Post.find(params[:id])
 
respond_to do |format|
  format.html # show.html.erb
  format.xml  { render :xml =&gt; @post }
end
end

View

  <strong>Name:</strong>
  &lt;%=h @post.name %&gt;
 
  <strong>Title:</strong>
  &lt;%=h @post.title %&gt;
 
  <strong>Content:</strong>
  &lt;%=h @post.content %&gt;
 
&lt;%= link_to 'Edit', edit_post_path(@post) %&gt; |
&lt;%= link_to 'Back', posts_path %&gt;

J’ai un @post dans mon Controller et j’ai le même dans mon View. Le h devant, c’est un helper (pas important pour l’instant). Puis j’ai .name, .title et .content. C’est les attributs du Model Post. Ok, mais moi je veux pas de Model, je fais comment ?

Lien entre le nom de la méthode et le fichier de View : la Route

Le truc important c’est :

respond_to do |format|
  format.html # show.html.erb

Ca fait qu’en allant sur http://localhost:3000/posts/show/2 (j’ai rajouté le “show” exprès), ça va exécuter la méthode show de mon Controller, ou devrais-je dire, mon action.

http://localhost:3000/posts/show/2
Application/Controller/Action/Id

Ca vient du fichier routes.rb :

map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'

C’est la syntaxe de base des URL. Très important.

Nouvelle Action, nouveau View

J’ai un Controller qui s’apple HomeController. Je veux une seule méthode (ou action) :

def bbx
    @message = 'Hello 29min'
    respond_to do |format|
      format.html # bbx.html.erb
    end
  end

Je crée le View correspondant : app\views\home\bbx.html.erb

<h1>bbx</h1>

Je lance mon serveur et je vais sur http://localhost:3000/home/bbx et là j’obtiens :
bbx

Rien de transcendant vu que c’est du pur html.

Une variable d’instance

J’ai galéré des heures pour trouver comment ça marchait. RailsGuides n’explique pas du tout ce qui va suivre. Et je ne sais pas pourquoi. Voici la phrase que je voulais voir et je l’ai trouvée sur ce très bon tuto :

Use controller instance variables in the view (and therefore the web page)

Je veux utiliesr mes variables d’instance de mon Controller (comme @post) dans mon View!
J’ouvre mon fichier bbx.html.erb. J’essaye <% @message %>. Ca ne marche pas. <% puts @message %> non plus. etc. J’ai essayé pleins de trucs.

Et en fait, il me manquait le signe égal. (Vincent, t’en avais parlé).
Mais bordel, c’est pas marqué dans RailsGuides les différentes notations pour ces trucs! Je pouvais pas deviner que pour afficher une variable il fallait ce égal (qui je pense sert plus généralement à d’autres choses).
<%= @message %> ça marche!

Mon View maintenant :

<h1>bbx</h1>
<h2><%= @message %></h2>

Et ça me donne :
bbx-hello

C’est lorsqu’on galère qu’on apprend beaucoup de choses.