Développeur Web RoR

Aller au contenu | Aller au menu | Aller à la recherche

mardi 14 décembre 2010

Tutorial Rubyonrails 3 - Partie 4 - ActiveRelation et scopes - Arel

Partie 4 – Rails3 -  ActiveRelation et scopes

N’hésitez à mettre des commentaires / à corriger mes fautes / à rajouter des choses !

Vous avez vu dans la partie 2 :

post = Post.where(:title => ’Mon titre’).first

Il existe de nombreux scopes ActiveRelation :

joins
limit
order
includes
where
offset

Vous aurez remarqué que ces termes ressemblent à SQL....

Donc si vous souhaitez trouver les 10 derniers commentaires visibles du post d’id 3, trié par ordre de création décroissant et qui contiennent la lettre ‘a’ dans leur contenu (l’exemple est volontairement compliqué pour que vous puissiez voir un aperçu assez complet):

comments = Comment.where(:post_id =>  3, :visible => true).where("content LIKE ?", "%a%").order(‘created_at DESC’).limit(10).all

Vous avez remarqué ce champ que j’utilise et qui apparait comme ça : created_at . Il s’agit de la date/heure de la création de l’objet. Rails l’ajoute par défaut dans la migration (ainsi que updated_at : date/heure de la dernière modification), ces champs m’ont toujours servi d’une manière ou d’une autre.
Vous noterez aussi que l'on peut chainer les scopes where.

Vous pouvez créer vos propres scopes et ils se définissent dans les models.
Par exemple si vous souhaitez filtrer les commentaires par visible :
Dans le model Comment :

class Comment < ActiveRecord::Base
 #Remarquez le singulier
 belongs_to :post
 belongs_to :reader

 scope :visible, where(:visible => true)
end

La syntaxe est :

scope :nom_du_scope, where(...).order....

Vous pouvez maintenant utiliser votre scope :

comments = Comment.where(:post_id =>  3).visible.order(‘created_at DESC’).limit(10).all

Quand vous voulez recupérer des enregistrements vous devez faire .all à la fin de l’ActiveRelation ou .first si vous ne souhaitez qu’un élément.

C’est un avantage (qui n’existait pas dans rails 2), du coup vous pouvez garder des ActiveRelations et continuer de chainer les conditions (d’un point de vue technique la requête SQL n’est executé que lorsque l’on appelle .all, .each, .length ou .first sur l’ActiveRelation):

Vous pouvez tester le chainage des scopes en console (rails c) :

ar = Comment.where(:post_id =>  3)
ar.length
ar = ar.visible
ar.length
ar = ar.order(‘created_at DESC’)
ar.length
ar = ar.limit(10)

Un peu de lecture:http://guides.rubyonrails.org/active_record_querying.html

Prochainement Partie 5 – Controller, actions

lundi 13 décembre 2010

PassengerPreStart sur Nginx + Phusion Passenger 3, pré-chargement des applications rubyonrails

Depuis passenger 3, il existe une directive qui permet de dire à nginx de faire une requête sur le serveur spécifié au démarrage d'nginx.

Du coup l'application se pré-charge pour que la première requête utilisateur (ou d'un moteur de recherche) ne prenne pas 3 heures, elle s'appelle passenger_pre_start :

server {

  listen 80;

  server_name foo.com;

  root /webapps/foo/public;

  passenger_enabled on;

}

server {

  listen 3500;

  server_name bar.com;

  root /webapps/bar/public;

  passenger_enabled on;

}

passenger_pre_start http://foo.com/; # <--- added

passenger_pre_start http://bar.com:3500/; # <--- added

Le problème en gros c'est que les instances de rails se mettent en veille quand elles ne sont plus utilisées (PassengerPoolIdleTime). Pour palier à ceci il existe la variable passenger_min_instances qui correspond au nombre minimum d'instances que passenger ne doit pas clean-upé (ah bon c'est pas français :-) ) :

server { 

 listen 80;

 server_name foo.com;

 root /webapps/foo/public;

 passenger_enabled on; 

 passenger_min_instances 1; # <--- added 

}

Voilà comme ça vos applications rails 3 sont toujours au top niveau premier chargement !

lundi 18 octobre 2010

Tutorial Rubyonrails 3 - Partie 2 - Création des models (rails generate model)

Partie 2 – Rails3 -  Création des models (rails generate model)

N’hésitez à mettre des commentaires / à corriger mes fautes / à rajouter des choses !

Allons-y notre blog a besoin de quelques models :

reader : celui qui laissera un comments sur un post.
post : un article du blog, il possède plusieurs comments.
comment : les commentaires des readers sur un post.

J 'ai volontairement mis en gras des termes pour qu'apparaissent les relations entre les models (ce que nous verrons la prochaine fois).

Comme nous l’avons vu plus haut nous allons utiliser : Rails generate model

La syntaxe est :

Rails generate model monmodel champ:type champ:type...

Voici les types disponibles:
  • string      (chaine 255 caractères)
  • text      (texte sans limite de caractère)
  • datetime    (champs date heure)
  • date      (champs date)
  • integer      (entier)
  • numeric     (champs pour des nombres avec précision)
  • float      (nombre décimal, à virgule...)
  • boolean     (booléen : true / false)

Pour notre blog:

rails generate model reader pseudo:string www:string
rails generate model post title:string content:text visible:boolean
rails generate model comment content:text visible:boolean

Nous avons nos models, mais que faire avec des models ?
Ils servent à faire le lien avec la base de données, à gérer les relations entre les models. On ne manipule quasiment plus de sql.

Executez les migrations, nous verrons plus tard de quoi il s’agit mais faites-le !
rake db:migrate

Vous pouvez tester les lignes de code qui suivent en lancant la console (pour quitter la console rails : tapez exit) :

rails console ou rails c

Pour créer un article :

post = Post.new(:title => “Mon titre”, :content => “contenu de mon article”, :visible => false)
post.save

Pour chercher un article par son ID :

post = Post.find(1)
ou
post = Post.where(:id => 1).first

Pour chercher un article par son title :

post = Post.where(:title => “Mon titre”).first

Pour le supprimer :

post.destroy

Rails (ActiveRecord pour être précis) se charge de construire les requêtes sql pour nous.
Attention si vous voyez find_all_by... ou find(:all) c’est vieux c’est rails 2 :-p

Maintenant que vous avez créé vos models vous pouvez aller les voir dans monblog/app/models .

Vous pouvez ajouter des méthodes d’instances (qui s’applique sur l’objet instancié) et des méthodes de classes dans vos models.

Exemple pour notre blog :

class Post < ActiveRecord::Base
 # Méthode d’instance qui renvoie le nombre de commentaire
 def nb_comment
   return self.comments.length
 end

 # Méthode de classe (précédé de self. ) qui affiche “Méthode de classe”
 def self.nb_post
   return Post.all.length
 end
end

Vous pouvez appeler votre méthode d’instance de cette manière (sur un objet instancié)

post = Post.find(1)
post.nb_comment

Et votre méthode de classe comme ceci (directement sur la classe) :

Post.nb_post

Attention ces 2 méthodes devraient être des scopes, c’est plus adapté mais c’était pour l’exemple.

Prochainement Partie 3 – Création des relations entre les models (détail relation et migration)

mardi 22 juin 2010

Passez à rails 3, prenez des bonnes habitudes

RubyOnRails

Bon il y a pas mal de choses qui changent entre rails 2.3 et rails 3, voici une liste de vidéos histoire de connaitre les nouveautés et de gagner du temps.

http://rubyonrails.org/screencasts/rails3

Vous pouvez aussi vous inscrire au flux rss histoire de savoir quand il y aura de nouvelles vidéos...

mardi 30 mars 2010

Rubyonrails avec Mongodb from scratch

mongodb

Ajouter les dépots mongodb et installer MongoDb

Editer le fichier /etc/apt/sources.list
sudo nano /etc/apt/sources.list

Ajouter à la fin du fichier (pour ubuntu 9.10)
Voir http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages

deb http://downloads.mongodb.org/distros/ubuntu 9.10 10gen

Puis on enregistre (ctrl + o, ctrl + x), on met à jour les dépots
sudo aptitude update

Ensuite on installe
sudo aptitude install mongodb-stable

Faire une pause vu le temps d'installation...
sudo prendre un café ou un chocolat

Créer un nouveau projet rails

rails projettestmongo cd projettestmongo

Editer le fichier de configuration du projet

sudo gedit ./config/environment.rb

Ajouter au fichier
config.gem "mongo_mapper"

Installer les gems
sudo rake gems:install

Créons les models product et category (un produit appartient à une categorie)
script/generate scaffold category name:string --skip-migration script/generate scaffold product name:string --skip-migration

Ensuite il faut éditer les models
class Category
#MongoMapper
include MongoMapper::Document
#Liste des attributs
key :name, String
many :products
end

class Product
#MongoMapper
include MongoMapper::Document
#Liste des attributs
key :name, String
key :category, ObjectId
end

On supprime le fichier index.html et on modifie les routes.
map.root :controller => :products, :action => :index

A ce stade l'application et utilisable.

Lien : http://www.2dconcept.com/articles/12-ruby_on_rails_mongo_mapper_fr?lang=fr http://railscasts.com/episodes/194-mongodb-and-mongomapper

mardi 9 février 2010

underscore dans le nom de domaine (sous domaine) et internet explorer - erreur 422 - InvalidAuthenticityToken - Rubyonrails

Cela fait 1 journée complète que je cherche pourquoi je n'arrive pas à m'authentifier sur un sous-domaine.

Erreur InvalidAuthenticityToken dans le log "production.log", et rails m'affichait l'erreur 422 (public/422.html) du fait que Internet Explorer n'arrivait pas à enregistrer le cookie et la variable de session.

Parce que IE n'arrive pas (Firefox si) à stocker les cookies et les variables de session sur des sites avec des _ dans leur sous-domaine.

Oui c'est vrai c'est interdit les _ mais je m'en souvenais plus !!

vendredi 29 janvier 2010

Créer un projet rails avec une version spécifique du framework

RubyOnRails

Merci à mon chef de projet pour cette astuce...
Si vous voulez créer un projet rails avec une version spécifique du framework rails :

Par exemple pour une version 2.3.2 :
rails _2.3.2_ mon_projet

Pratique pour voir les différences entre deux versions sur des projets vides...

- page 2 de 4 -