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 => @post } end end
View
<strong>Name:</strong> <%=h @post.name %> <strong>Title:</strong> <%=h @post.title %> <strong>Content:</strong> <%=h @post.content %> <%= link_to 'Edit', edit_post_path(@post) %> | <%= link_to 'Back', posts_path %>
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 :

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 :

C’est lorsqu’on galère qu’on apprend beaucoup de choses.
Flux RSS
Et oui c’est pas parce que le framework fait tout qu’il faut pas savoir comment il fait :p
Btw je devine pourquoi c’est pas exliqué dans la doc.
Lorsque le controller “appel” ta vue pour faire le rendu de la page il lui passe en même temps la requete http d’origine, et eventuellements quelques variables. Tous les framework web font ça, c’est du très classique.
Le coup du “<%=” aussi c’est du classique (ca marche comme ca en php, java et asp), si tu fais ce qui se trouve entre les “” est executé.
Si tu fais “” tu exécute du code, mais qui ne fais rien
Il faut donc soit récup le flux dans lequelle ta view “ecrit” et bourrer dedans à la main soit faire un truc pour que le langage sache que la variable doit être affiché (le coup du “<%=”)
En fait, je sais pas si t’as bien fais de choisir Rails pour commencer. Je pense pas que ruby soit vraiment conçu pour apprendre. Quand à Rails c’est super haut niveau mais si tu sort des démos CRUD, ça suppose que tu comprenne un minimum ce qui se passe “derrière”.
Bref, si tu veux vraiment maîtriser un framework, à un moment ou à un autre faut mettre les mains dans le cambouis :p
Quand tu comprendra comment le truc fonctionne en interne, si tu sais pas du tout faire un truc t’aura quand même une idée de la ou il faut chercher ^^
Au final t’as galéré, mais je suis sur que t’as appris plein de trucs
J’aimerais bien mettre les mains dans le cambouis. Et c’est pour ça que je suis passé par le Ruby avant de passer à Rails, pour savoir un peu comment ça marche. Mais là, pour le coup du <%= et bien il était pas expliqué dans le RailsGuide alors que c’est justement un élément qui me permet d’avoir davantage de contrôle sur ce que je veux afficher.
Peut-être que Rails est pas le meilleur moyen pour apprendre non, mais si j’arrive à me dépatouiller avec celui-là, j’apprécierais encore mieux d’autres frameworks, voire d’autres langages.
En fait ce que je veux dire par la c’est que Rails ne s’adresse pas à des gens qui apprennent le dev web.
Je pense que le framework visent plutôt les dev Java / C# / php qui ont déjà de l’expérience dans le domaine, qui savent comment un framework web fonctionne, et qui cherchent quelque chose de plus haut niveaux, ou / et plus élégant pour développer plus vite.
A mon avis, les concepteurs de la doc tiennent pour acquis une certaine connaissance du sujet. Ils ne vont donc pas expliquer les bases, mais juste montrer comment elles sont misent en pratique avec Rails. D’ailleur sur la première page du RailsGuide il y a 3 grande sections (Model, View, Controller) sans explications. Cela suppose que tu sache déjà de quoi il s’agit.
Les langages compilés vont te rajouter une couche de technique pur, selon les langages et les framework tu va devoir faire certaines choses “à la main”. Par exemple en JEE de base, le lien entre ton controller et ta vue doivent être explicite. Ta difficulté ici, c’est que tu apprend à la fois un langage et un framework. En C/C++ tu va te manger la gestion de la mémoire.
Dans l’absolue, il n’y a pas de langage idéal pour apprendre. Le vrai challenge du développement ne se trouve pas dans la technique.L’important c’est le fond, pas la forme
Je me suis rendu compte il y a un moment que lorsque j’avais des cours de java à l’IUT, je trouvais ça vraiment hyper chiant. En fait on codait pas beaucoup, le cours était plus porté sur la conception OO que sur la technique.
Avec le recul je sais que c’était la bonne méthode, car maintenant je peux prendre n’importe quel langage, même le plus tordu (je bouffe du C++ en ce moment) et lui faire faire n’importe quoi avec.
Garde le moral
Et si je peux me permettre, RoR est bien pour apprendre à développer ton appli web… Il est bien car il fait plein de choses ingrates ( => le camboui..) seul, te dessine une trame de fond qui convient la plupart du temps, et il a l’avantage d’être pragmatique en restant sobre (parfois trop, ce qui peut poser problème…), mais surtout valide (encore que parfois les vues sont un peu dégueu… mais bon..)
Je rejoins Julien sur les bases du fonctionnement d’un framework, le pattern MVC est sexy, il est même très bien, mais effectivement, ça parait évident à l’averti, stupéfiant au débutant… La manipulation des données se fait en amont et est recrachée en fin de chaine sur la vue…
A moins que tu n’aspires à devenir développeur Web à ton compte, pro ou semi-pro, Julien a raison sur le fait que t’apprennes plein de choses…. Sinon comme je te l’ai déjà dit, hésite pas à me laisser une petite question sur MSN, je te répondrai sans souci si j’ai la réponse
En tous cas, t’avances pas si mal, et les tutos que tu lis sont assez riches, même si mes préférés restent pour l’instant ceux d’Akita (akitaonrails.com).
t’en fais pas mon fils, on surveille ta progression dans l’univers de la programmation