Episode 2 : Views, Partials, Formulaires et DataMapper

Posted By: Hassane Moustapha On lundi 27 septembre 2010

Hello,

Nous continuons notre série avec l'épisode 2 où nous parlerons des vues, des vues partielles, des formulaires et de DataMapper.

Dans l'article précédent, nous avons appris à installer sinatra et à écrire notre première application :)
Aujourd'hui nous allons faire des trucs un peu plus intéressants. Nous allons :
- Créer un layout pour notre application
- Créer des vues spécifiques aux actions utilisées
- Apprendre à utiliser les vues partielles
- Créer des formulaires
- Envoyer les données du formulaire à notre application sinatra (multiple block parameters)
- Enregistrer ses données dans une base de données

Que des choses simples mais largement suffisantes pour créer une application web dynamique répondant aux besoins.
Nous allons créer une application AppEngine basée sur Sinatra !

1 - appcfg.rb generate_app serie

La génération de l'application prendra quelques secondes (environ 30 secondes).
Une fois notre application générée, nous pouvons passer au code et nous amuser.

Voici l'architecture de l'application générée.

Notons que le fichier "main.rb" que j'ai créé n'a pas été généré par "appcfg". Et c'est dans ce "main.rb" que nous aurons l'essentiel de notre application : traitements, routages etc.
 Le fichier Gemfile contient l'ensemble des dépendances que notre application peut avoir.

Et now au boulot :
Remplissons notre "main.rb" avec ce code :












Pour répondre à la requête GET, l'application renvoie la vue 'index' en utilisant le moteur de template erb.
La vue "index" doit se trouver dans le repertoire "views" qui se trouve à la racine du projet et doit être enregistrée sous le nom "index.erb".


2- Création de la page d'accueil :

      Jetons un coup d'oeil sur le contenu de la vue "index" :
Sur cette page, nous avons juste un message de bienvenue et un lien pour poster un nouveau message !
Cliquons sur ce lien et créons un message.

Nous devons préparer notre application pour qu'elle puisse répondre à cette requête.
Notre main.rb devient  :
3 - Création d'un mécanisme pour l'ajout de nouveaux messages 

Passons maintenant à la création de la vue 'nouveau.erb' qui nous permettra de poster de nouveaux messages.
Et surtout n'oublions pas que toutes les vues sont placées dans le répertoire VIEWS !

Notre vue nouveau.erb va ressembler à ça :




















Je pense qu'il n'y a pas grand chose à dire sur cette vue! Elle contient un formulaire très simple.
Passons maintenant au "core" de notre application et voyons à quoi elle ressemble actuellement :

























Beaucoup de nouvelles choses :) je sais !
Explications :
Nous avons des données qui proviennent d'une vue; ces données (le message en gros ) doivent être enregistrées. Et pour ce faire, nous allons utiliser une base de données et passer par une couche qui nous facilitera la communication avec cette base de données!  Cette couche c'est DataMapper.

Je ne vais pas entrer dans les détails et dire comment fonctionne DM (visitez son site web ...).
Nous avons créé un MODEL (la classe message) pour notre entité Message avec les propriétés (id, nom, email et body) et inclus DataMapper::Resource pour lui permettre d'agir comme un 'document'.
Nous avons ensuite défini un point de sauvegarde que nous avons appelé 'default' pour dire à DataMapper où est ce qu'il doit stocker nos données; et dans cet exemple nous utilisons DataStore de Google AppEngine.

La dernière modification était l'ajout du bloc de code qui permet l'enregistrement du message et la redirection vers la vue index ( redirect '/' ).

4 - Affichage des messages créés

A ce stade nous pouvons afficher les messages enregistrés dans notre base de données et nous allons utiliser la vue "index.erb" pour le faire.
Alors modifions cette vue!
















Nous vérifions que des messages existent déjà ! et les afficher !
PS: le test (if @messages do) n'est pas obligatoire ! il est là juste pour souci de clarté :)

Modifions aussi le bloc qui gére la vue "index.erb" :
Actuellement, nous pouvons créer des messages et les afficher.
Il serait cool de pouvoir commenter chacun des messages si l'on veut bien le faire ! Et pour le faire facilement on peut créer une vue partielle et l'utiliser quand on en a besoin. Le seul hic est que sinatra ne supporte pas les vues partielles (pas par défaut) :( 
Aucun problème :) nous allons apprendre à Sinatra comment utiliser les vues partielles et ce grâce au langage ruby !
Nous allons rajouter une seule methode dans un bloc à l'intérieur de la classe MonApplication et avant toutes methodes :

   helpers do
        def partial (la_vue, locals = {})
              erb(la_vue, :layout => false, :locals => locals)
        end
    end

Nous pouvons désormais utiliser les 'partials' depuis toutes nos vues.
Ex : <%= partial(:commentaire, :message => message.id) %>

Et now .... la fin de cet épisode!
Dans le prochain épisode, nous allons apprendre à créer des "composants" web et des widgets (Rack applications) et surtout comment intégrer d'autres services Google à notre application AppEngine...

Waiting for your feedback !

Série Google AppEngine : Sinatra On AppEngine

Posted By: Hassane Moustapha On lundi 20 septembre 2010


Hi guys !

Dans ce gtug, nous essayons tous de partager nos connaissances et expériences. 
Chose que j’essaie de faire ! Et je veux parler de Google AppEngine et de sinatra pour aider les "intéressés" à écrire des applications  web (sites et services) et les héberger sur AppEngine.

Je commence cette série par une présentation de ce que nous aurons à utiliser :
         --> Sinatra
           --> Rack
           --> DataMapper
           --> DataStore

Let's start !

         Sinatra n'est pas un framework mais une bibliothèque qui vous permet de construire pratiquement n'importe quel type d'applications basées sur le Web d'une manière très simple et super sexy aussi. Lorsque vous codez en Sinatra vous n'êtes lié que par HTTP et votre connaissance du langage Ruby.

            Les applications Sinatra sont généralement écrites dans un fichier unique. Elles démarrent et s'arrêtent presque instantanément et n'utilisent pas beaucoup de mémoire et servent les demandes (requêtes) de façon très rapide. Mais, elles offrent aussi presque toutes les fonctionnalités principales que vous attendez d'un  framework web complet : les ressources RESTful, les templates (ERB, haml / Sass, et Builder), les types MIME, fichiers transmis en continu, etags, le développement en mode de production, gestion des exceptions.

         Sinatra est compatible avec tous les frameworks de TEST écrits en Ruby et est aussi multithread (par défaut), mais vous pouvez vous passer de cette "option" pour envelopper certaines de vos actions(traitements) dans un mutex indépendant.

Vous pouvez utiliser Sinatra avec toutes les bases de données en passant par ActiveRecord, DataMapper ou certains autres ORM
Une dernière chose dans cette brève présentation : Sinatra est basée sur Rack et utilise mongrel par défaut.


Installation de Sinatra :

Sur windows :
        c:> gem install sinatra
Sur Linux/Os X :
          sudo gem install sinatra

J'avoue que l'installation est assez compliquée :)

Première application Sinatra

Nous allons écrire une application très simple et que l'on fera évoluer step by step.

require 'sinatra'

get '/' do
    "Hello world:"
end

Enregistrons ce bout de code dans un fichier que nous allons appeler "mon_app.rb" et lançons le comme suit :

       ruby mon_app.rb

Notre application est disponible sur ==> http://localhost:4567.


Blake Mizerany le créateur de Sinatra dit qu'il est préférable d'apprendre (ou d'essayer) Sinatra avant Ruby on Rails:
  
"Lorsque vous découvrez un framework aussi large, vous êtes présenté à une abondance d'idées, de contraintes, et de magie. Pire que tout, on vous impose un modèle. Dans le cas de Rails, c'est le MVC. MVC ne correspond pas à la plupart des applications web au tout début ou pas du tout. " Blake Mizerany


Retour au code ! Essayons de comprendre ce que nous avons écrit :

require 'sinatra' ==> import de la gem (ou bibliothèque)

get '/' do
     "hello wolrd"
end

On avait dit (plus haut) qu'avec Sinatra on n'a affaire qu'au HTTP et aux objets Ruby :
sans entrer dans les détails de ce que c'est une requête HTTP on dira pour chaque type de requête on a un bloc de code à exécuter.
La chaine de caractères "hello world" est renvoyée à tout agent ayant émis une requête HTTP avec le verbe GET et sans paramètre.

J'espère que c'est assez clair :) Sinon vous pourrez jeter un coup d'oeil sur la documentation sur le site officiel de sinatra (http://sinatrarb.com).

Ceux qui ont déjà eu à utiliser des frameworks web se demanderont au début "où mettre telle ou telle autre chose ?"  La réponse est assez simple "Tout type de choses a sa place" : les vues (ou pages web) sont placées dans le répertoire "views" à la racine du projet, les css, js et images dans le répertoire "public".

Un exemple :
  
      Mon_Projet_Sinatra\

       -- views\
                        -- layout.erb
                        -- index.erb
       -- public\
                        js\
                            -- mes_scripts.js
                        css\
                            -- style.css
                        images\
                           -- vos images 

       -- mon_app.rb
       -- Gemfile                                                                                                                        

C'est à peu près à ça que ressemblent les applications sinatra (pas toutes).

C'est la fin de cette première partie! Dans le prochain article, nous allons jeter un coup d'oeil sur les vues (le layout général et les vues spécifiques) et introduire DataMapper et apprendre à l'utiliser dans une application Sinatra.

snipt

Fourni par Blogger.