% Copyright (c)  2007 Rémi Laurent <remi.laurent@fsugar.be>.
% Permission is granted to copy, distribute and/or modify this document
% under the terms of the GNU Free Documentation License, Version 1.2
% or any later version published by the Free Software Foundation.

\documentclass{beamer}

\usetheme{PaloAlto}
\setbeamercovered{transparent}

\usepackage[french]{babel}
\usepackage[utf8]{inputenc}


\title{Présentation Ruby On Rails}
\date{\today}
\author{Rémi Laurent}
\institute{FSUGAr - http://www.fsugar.be}

\begin{document}
\frame{\titlepage}


%------------------------------------------------------------------- 
\part{Ruby}
\frame{\partpage}

\section{Ruby}
\begin{frame}
\frametitle{Ruby}

Basé sur le langage Ruby,\\
voir l'ancienne présentation
\newline

Résumé : Ruby c'est fnu (tm) 

\begin{itemize}
	\item Orienté Objet
	\item Itérateurs : collect, each \& others
	\item Opérateurs sur les collections de donnée
	\item Classes anonymes : Struct
\end{itemize}
\end{frame}

\section{Webbrick}
\begin{frame}
\frametitle{Webbrick}
Serveur web totalement écrit en Ruby.
\newline

Utilisé pendant les phases de développement.
\begin{itemize}
	\item logging paramètrable
	\item debugging / breakpoint
	\item activation ou non du caching
	\item tests fonctionnels
	\item c'est lent, pour la production : lighttpd, mongrel, ...
\end{itemize}
\end{frame}

\section{Rake}
\begin{frame}
\frametitle{Rake}
Rake - Ruby make
\begin{itemize}
	\item migration (base de donnée)
	\item automatisation des tests
	\item nettoyage cache/session
	\item génération documentation
	\item déploiement / 'packaging'
\end{itemize}
\end{frame}


%------------------------------------------------------------------- 
\part{Modèle}
\frame{\partpage}

\begin{frame}
\frametitle{Un modèle ?}
Un modèle ?
\begin{itemize}
	\item la représentation d'un objet
	\item les opérations sur cet objet
	\item les opérations sur une classe d'objets
	\item les relations avec d'autres classes d'objets
	\item les contraintes pour que l'objet soit cohérent
\end{itemize}

\end{frame}

\section{Données présentées}
%------------------------------------------------------------------- 
\begin{frame}
\frametitle{Données présentées}
Une facture est constituée de commandes,\\
constituée un total à payer,\\
a un client qui devra la payer,\\
a une date limite de facturation,\\
a un état (payé, en attente, en retard, ...)
\end{frame}

\section{Validation}
\begin{frame}
\frametitle{Validation}
Encore faut-il que les données fournies soient cohérentes ?\\
Normalement la BD s'en occupe ... Mysql ?
\begin{itemize}
	\item validates\_presence\_of
	\item validates\_uniqueness\_of
	\item validates\_associated
	\item validates\_format\_of
	\item validates\_length\_of
	\item validates\_numericality\_of
\end{itemize}
Et toutes les méthodes supplémentaires qu'on voudrait rajouter 'à la main'
\end{frame}

\begin{frame}
\frametitle{Etapes validation}
A la mise à jour ou à la création :
\begin{itemize}
	\item before\_validation
	\item after\_validation
	\item before\_save
	\item before\_create/update
	\item after\_create/update
	\item after\_save
\end{itemize}
Ou encore before\_destroy et after\_destroy
\end{frame}

\section{Relations}
\begin{frame}
\frametitle{Relations}
Relations entre les différentes classes d'objets
\begin{itemize}
	\item has\_many
	\item has\_one
	\item has\_and\_belongs\_to\_many
	\item modèle arbre
	\item héritage
\end{itemize}
\end{frame}

\section{Migration}
\begin{frame}[fragile]
\frametitle{Migration}
\begin{verbatim}
  def self.up
    create_table :comments do |t|
      t.column :author, :string, :null => false
      t.column :title, :string, :null => false
      t.column :text, :text, :null => false
      t.column :article_id, :integer, :null => false
    end
    execute "ALTER TABLE comments ADD CONSTRAINT  \
      fk_comments_articles FOREIGN KEY (article_id) \
      REFERENCES articles(id) ON DELETE RESTRICT;"
  end
  def self.down
    drop_table :comments
  end
\end{verbatim}
\end{frame}

%------------------------------------------------------------------- 
\part{Contrôleur}
\frame{\partpage}
%------------------------------------------------------------------- 
\begin{frame}
\frametitle{Contrôleur}
Le contrôleur traîte les objets (modèles)\\
en fonction des actions (url) demandées,\\
ainsi que des paramètres (GET / POST),\\
redirige vers une page,\\
ou fait en rendu d'une vue avec les données obtenues.
\end{frame}

\begin{frame}[fragile]
\frametitle{Requête DB}
\begin{verbatim}
Article.find(params[:id])
Article.find(:all, 
   :conditions => [ "title ilike ?", title ]
   :order => 'date')
Article.find(:all, :offset => 10, :limit => 10), 
   :group => 'title')
\end{verbatim}
Il existe aussi des 'scopes', on effectue une requête, suivie d'une autre portant uniquement
sur les résultats renvoyés par la première.
\end{frame}

\begin{frame}
\frametitle{Filtre}
On peut également placer des filtres, avant ou après une action.\\
Utile pour spécifier qu'une page ne peut être vue que si un utilisateur est authentifié.\\
Ou bien pour réaliser une trace de la visite de l'utilisateur (petit poucet).
\end{frame}

\begin{frame}
\frametitle{get/post/xml/...}
En fonction du type de requête effectuée\\
GET, POST, AJAX\\
on peut servir des pages différentes\\
HTML, RJS, XML, binary (PDF, PNG, ...)
\end{frame}

\part{Vue}
\frame{\partpage}
\begin{frame}
\frametitle{Vue}
La vue présente simplement les données collectées,\\
une interface avec l'utilisateur\\
il s'agit en fait des pages Web de notre application.
\end{frame}

\section{Tag Helper}
\begin{frame}
\frametitle{Tag Helper}
Tout une série d'assistance pour générer la plupart des tags intéressants.
\begin{itemize}
	\item hidden\_field
	\item text\_field
	\item text\_area
	\item date\_picker
	\item collection\_select
	\item link\_to
	\item text\_field\_with\_autocomplete ?
\end{itemize}
La sélection ou les valeurs sont automatiquement 
effectuées dans le cas d'une édition d'une donnée par exemple.
\end{frame}

\section{Ajax}
\begin{frame}[fragile]
\frametitle{Vue}
La pluparts des fonctionnalités d'AJAX sont proposées sous forme de tags
également, exemple précédent ou encore
\begin{verbatim}
<%= link_to_remote "Cacher",
  :complete => "new Effect.Fade('my_div')",
  :url => { :action => 'hide_data', :id => my_data}
%>
\end{verbatim}
\end{frame}

\section{Layout \& Partial}
\begin{frame}
\frametitle{Layout \& Partial}
Layout, un layout et du contenu.
\newline
Partial, un morceau de page avec une injection de données\\
ou encore une partie de page rafraîchie avec du JavaScript.
\end{frame}

\section{View Helper}
\begin{frame}
\frametitle{Vue}
Toute une série de 'helpers' pour faciliter la vie,\\
la possibilité d'en faire soi-même

\begin{itemize}
	\item get\_day(21,4,2007)
	\item username
	\item ...
\end{itemize}
\end{frame}

\part{Walkthrough}
\frame{\partpage}
\begin{frame}
\frametitle{Walkthrough}
\begin{enumerate}
\item affiche une vue (à partir d'un contrôleur),
\item l'utilisateur réalise des actions (éventuellement AJAX),
\item POST/GET, passage dans le contrôleur,traîtement des informations,
\item gestion grâce aux modèles (validation, relations, ...),
\item redirection vers/rendu d'une vue,
\item GOTO 1
\end{enumerate}
\end{frame}

\part{FHS}
\begin{frame}
\frametitle{FHS}
\begin{itemize}
	\item app\\
	\begin{itemize}
		\item controllers
		\item views
		\item models
		\item helpers
	\end{itemize}
	\item test\\
	\begin{itemize}
		\item fixtures
		\item functional
		\item unit
	\end{itemize}
	\item db
	\item config
\end{itemize}
\end{frame}

\part{Various}
\frame{\partpage}

\section{Environnement}
\begin{frame}
\frametitle{Environnement}

\begin{itemize}
\item Development
\item Testing\\
	\begin{itemize}
	\item Unitaires
	\item Fonctionnels
	\end{itemize}
\item Production
\end{itemize}

\end{frame}
\section{Sessions}
\begin{frame}
\frametitle{Sessions}
Support relativement simple des sessions\\
session[:my\_object]\\
permet de sérialiser n'importe quoi on presque
\end{frame}

\begin{frame}
\frametitle{Flash}
Variables de sessions assez spéciales\\
gardées que d'un contrôleur à l'autre\\
peuvent être conservés d'un contrôleur à l'autre en le spécifiant explicitement.
\end{frame}


\section{Plugins}
\begin{frame}
\frametitle{Plugins}
Support de plugins via un script qui liste les plugins disponibles,
gère leur mise à jour (svn), divers plugins existent :
\begin{itemize}
	\item internationalisation
	\item authentification
	\item messages d'erreurs personnalisés
	\item wiki / révision de versions
	\item mise en forme HTML à partir d'une syntaxe Wiki
	\item etc ...
\end{itemize}

\end{frame}

\section{Webservices}
\begin{frame}
\frametitle{Webservices}
Y'en a, RTFM
\end{frame}


\part{Références}
\frame{\partpage}

\section{Documentation en ligne}
\begin{frame}
\frametitle{Documentation en ligne}
\begin{itemize}
	\item http://api.rubyonrails.org
	\item http://www.rubyonrails.org
	\item http://www.railsfrance.org
	\item des PDF que je mettrai sur mon site\\
	http://www.fifi.be/vrac/slides/rails-pres/
\end{itemize}
\end{frame}

\section{Documentation intégrée}
\begin{frame}
\frametitle{Documentation intégrée}
\begin{itemize}
	\item gem\_server : documentation des packages installés par Rails
	\item rake doc:plugins (documentation des plugins installés)
\end{itemize}
\end{frame}

\section{Livres}
\begin{frame}
\frametitle{Livres}
\begin{itemize}
	\item Agile Web Development with Ruby On Rails
	\item Rails Recipes
	\item Ruby Rails Up and Running
\end{itemize}
\end{frame}

\end{document}


