Retour au sommaire du support de cours

(Dernière modification : 2013/11/12)

Cliquez sur la table des matières pour la cacher / développer :

1) Rails Rest et Crud :

1.1) Les opérations de base pour la persistance des données :

Par convention avec Ruby On Rails, la cinématique de gestion des opérations de C.R.U.D. est la suivante : Cinématique Actions Rails

Voici la correspondance entre les routes nommées et les actions :
Rails Action et Routes

1.2) Gestion des contrôleurs :

  • Génération d'un contrôleur :
  • script/generate controller <NomDuContrôleur> <méthode_d_action_1> <méthode_d_action_2> ... <méthode_d_action_n>
    Le nom du contrôleur est en Camel Case et au pluriel.
    Il peut être mis au singulier pour un contrôlleur qui ne gère pas de modèle (home, admin, etc.).
    Le nom du fichier ruby contenant la classe du contrôleur sera généré avec des minuscules (mots séparés par des caractère de soulignement : '_' ).
    Il sera mis au pluriel si l'instruction generate était au pluriel.
    Le nom de la classe du contrôleur dans le fichier Ruby sera généré au pluriel ou au singulier de la même manière

  • Génération d'un contrôleur avec ses vues :
  • Si l'on veut générer automatiquement toutes les méthodes de CRUD ainsi que leurs vues associées,
    il suffit d'utiliser le scaffolding :
    script/generate scaffold <NomDuModèle(Singulier)> <champ_1:type_1> <champ_2:type_2> ... <champ_n:type_n>
    
    #exemple :
    script/generate scaffold Photo nom:string largeur:integer hauteur:integer image:string description:text commentaire:text prise:datetime supprimee:boolean
    

  • Suppression d'un contrôleur avec ses vues :
  • script/destroy controller <NomDuModèle(Singulier)>

 

2) Communication entre composants du M.V.C. :

2.1) Trois principaux modules Ruby composent le code de Ruby On Rails :

Un framework cohérent.

Le Contrôleur est la partie centrale du M.V.C. (Module Ruby ActionController). C'est la classe qui gère les traitements applicatifs.
C'est lui qui demande aux Modèles (Module Ruby ActiveRecord) de préparer les données à afficher.
C'est ensuite lui qui invoque la Vue (Module Ruby ActionViewe) en lui fournissant les données préparées par la vue.

2.2) Communication entre Contrôleur et Vue :

Toutes les variables d'instance (commençant par un '@') définies à l'intérieur d'une action du Contrôleur, sont accessibles dans la Vue correspondante.

2.3) render déporté :

You may want to look at abstract_controller/rendering.rb It looks like in rails 3 we should be able to do something like this: renderer = ApplicationController.view_context_class.new(...) And the module master_helper_module is now accessed by name _helpers, and it should be already included in view_context_class

 

3) Routage :

3.1) Fichier de configuration des routes :

Il se trouve dans :
config/routes.rb

3.2) Listage des routes :

rake routes

3.3) Types de protocole :

De nombreux formats peut être générés par la méthode render:
  • Http

  • Javascript pur
  • render :js => "alert('Hello Rails');"
  • Xml
  • render :xml => @photo
    Test :
    curl http://al:3000/photos/2.xml
  • Json
  • render :json => @photo
    Test :
    curl http://al:3000/photos/2.json
  • Rss
  • Test :
    curl http://al:3000/photos.atom

3.4) Associations ActiveRecord :

On peut exprimer les relations entre modèles dans des requêtes REST :
map.resources :companies, :has_many => [:projects, :services]

3.5) Routes statiques :

map.admin '/admin/inflexions', :controller => 'admin_inflexions'

3.6) Instructions utiles :

Détection de l'environnement :
if Rails.env.development?

3.7) Urls formatées :

# deprecated
formatted_post_path(post, :xml)
# maintenant
post_path(post, :format => :xml)

# deprecated
formatted_new_user_path(:json)
# maintenant
new_user_path(:format => :json)

 

4) Bonnes pratiques de développement :

4.1) Répartition du code :

Le code doit-être concentré dans les Modèles et non dans les Contrôleurs :
Code rails : gâteau en couches

4.2) Méthode try :

Les versions de Rails >= 2.3 ont une méthode "try" très utile, qui peut éliminer proprement le besoin de blocs de code comme les suivants :
(que l'on trouve souvent dans les application Rails !).

@post = Post.find_by_permalink("hello-world")
unless @post.nil?
	@post.body
end

#A la place de cela, nous pouvons éviter la vérification du 'nil' en utilsant try comme suit :
Post.find_by_permalink("hello-world").try(:body)

4.3) Accesseurs de classe :

It seems odd that cattr_* (i.e. cattr_accessor, cattr_reader, cattr_writer)
is not in the native Ruby and that you have to require active support and rubygems to get this to work.
Including the rails stuff appears to slow things down a little. Why is this not built in the native Ruby source?

4.4) Environnement :

On peut déterminer l'environnement en cours avec les instructions suivantes :
RAILS_ENV #Rails 2

Rails.env #Rails 3

ENV['RAILS_ENV'] #Les deux