Développeur Web RoR

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

Tag - rubyonrails

Fil des billets

jeudi 19 mai 2011

Netbeans 7.0 pour faire du rubyonrails

Bon alors vous pouvez utilisé netbeans 7.0 pour faire du rubyonrails.

1) Téléchargez netbeans 7.0 ( http://netbeans.org/downloads/ ), elle n'existe pas encore en français, prenez la version php, plus légère.

2) Lancez NetBeans 7, puis allez dans "Tools" > "Plugins". Dans l'onglet "available Plugins" recherchez "ruby". Puis cochez le plugin "Ruby and Rais". Enfin cliquez sur "install". A la fin il est demandé de redémarrrer netbeans, faites le.

Voilà voilà vous avez netbeans 7.0 tout beau tout propre pour programmer dans votre langage préféré : ruby avec son framework rails

vendredi 4 février 2011

Les petits bouts de code bogués dans les applications RubyOnRails 3

Voici quelques exemples de portion de code buggé :

1) Gestion des id et relations

Exemple de mauvais code :

family = Family.new(:name => "Bla")

product = Product.new(:family_id => family)

On a ici une confusion entre l'objet et l'id de l'objet, rails est magique mais pas tout le temps :

Soit on fait :

product = Product.new(:family_id => family.id)

Soit :

product = Product.new(:family => family)

Et non

product = Product.new(:family_id => family)


2) Utilisation de find_by_sql

Exemple de mauvais code :

families = Family.find_by_sql("SELECT * FROM families f JOIN products p ON p.family_id = f.id")

Family.find(families.first.id)

#Génére une erreur

Dans cet exemple de code, ActiveRecord ne sait pas quels ids mapper dans les objets family. Il se peut que ce soit les ids des produits qui sont dans les champs ids des objets ruby.

Pour ne pas avoir ce problème il ne faut retourner que les champs de l'objet :

families = Family.find_by_sql("SELECT f.* FROM families f JOIN products p ON p.family_id = f.id")

Le mapping est dans ce cas correct !

3) Sauvegarde en cascade :

# Ici on a family has_many products et product belongs_to family

p = Product.new(:name => "Produit1")

f = Family.new(:name => "Family1")

Ceci sauvegarde la famille en cascade :

p.family = f

p.save

#true

Ceci ne sauvegarde pas le produit en cascade :

f.products << p

f.save

#false

Si vous avez d'autres exemples laissez des commentaires !


mercredi 19 janvier 2011

Une fonction pour vider les tables associées aux models - rubyonrails 3

Voici une fonction pour vider les tables associées aux models dans une application rubyonrails 3.

Soit en console, soit dans votre code, vous pouvez faire :

ActiveRecord::Base.class_eval do

    def self.detonate

        all.map(&:destroy)

    end

end

Cela a pour effet d' "injecter la fonction dans tous les objets" active record.

Ensuite il suffit d'appeler la fonction de cette manière :

Product.detonate

Ainsi tous les produits sont supprimés de la base de données, pratique pour faire du ménage !

Source : http://snippets.dzone.com/posts/show/11603

Rendu json avec rails 3

Si vous souhaitez faire un rendu json : voilà comment procéder :

Dans routes.rb :

get "show_product/:id(.:format)" => "products#show_product"

Dans votre controlleur products_controller.rb :

def show_product

    @product  = Product.where(:id => params[:id]).first

    respond_to do |format|

      format.html

      format.json{

        render :json => @product.to_json(:include => [:family])

      }

    end

end

Vous aurez remarqué l'option include pour la fonction to_json qui permet d'inclure des models liés dans le rendu json !

mercredi 5 janvier 2011

Générer des graphiques et schemas de données à partir d'une application rubyonrails 3 avec RailRoady

Comme toujours le titre est explicite : RailRoady (fork de railroad pour rails 2.3) permet de générer des graphiques et schemas de données à partir d'une application rubyonrails 3.

Dans votre gemfile :


gem 'railroady'

Sous votre distrib, (issu de la doc railroady) tapez :

sudo port install graphviz

Ensuite dans le répertoire de l'application rails 3 :

bundle install
rake diagram:all

Les graphiques sont générés dans le répertoire doc de votre application.

Source et site officiel : http://railroady.prestonlee.com/

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 !

- page 2 de 5 -