Langages/Ruby/Rails

Un article de Agora2ia.


rails.png


Mots clefs : Rails, RubyOnRails, Ruby On Rails, RoR


Sommaire

Voir aussi

Notions

  • Squelette : mashup ?!
  • REST
    • ActiveResources : API pour services REST
  • Plugin et generator


Console

L'un des avantages Ruby et de Rails sont leurs consoles, qui permettent :

  1. d'expérimenter en live le langage (ce qui permet de progresser rapidement)
  2. d'intérroger l'état de l'application.

Pour Ruby on l'appelle l'irb, et pour Rails on parle bien de 'console.

Pour lancer la console, se mettre dans une console en ligne de commande, à la racine du projet et taper :

rails c

Vous trouverez sur cette page 10 choses à savoir sur la console.

APIs


Associations et relations

Polymorphic Associations


Migration pour l'association HABTM

HABTM est l'acronyme de "has and belongs to many".

  • Voir aussi :
  • Il est important de noter que le nom des deux tables utilisés pour nommer la table d'association doivent être par ordre alphabétique ! (dans l'exemple ci après, on prend "atoms" en premier, puis "groups" en second !)
  • Générer la migration > script/generate migration create_atoms_groups
  • Ecrire le code de la migration :
class CreateAtomsGroups < ActiveRecord::Migration
  def self.up
      create_table :atoms_groups, :id => false do |t|
        t.integer :atom_id
        t.integer :group_id
      end
  end

  def self.down
      drop_table :atoms_groups
  end
end
  • L'exécuter : > rake environment RAILS_ENV=test db:migrate


Migrations

On peut faire avec les migration tout ce que l'on peut faire en SQL, tant au niveau de la structure qu'au niveau des données : on peut aussi ajouter des données via une migration.

Commandes de base

  • Créer une migration : script/generate migration AddParentToGroup
  • Supprimer une migration : script/destroy migration AddParentToGroup
  • Exécuter la migration :
    • En développement : rake db:migrate
    • En test : rake environment RAILS_ENV=test db:migrate
  • Réinitiliser la base" :
    • Le meilleur moyen vider la base (cette façon résiste aux migrations qui ne sont pas réversibles) : rake environment RAILS_ENV=test 'db:drop
    • Avec ou sans l'option rake environment RAILS_ENV=test db:drop
    • Puis rake environment RAILS_ENV=test db:migrate


Revenir à une migration particulière

Pour identifier la migration cible :

rake db:migrate:status

Puis positionner cette migration

rake db:migrate VERSION=20130630143353


PERIME :

  • Se connecter à la base de données :
    • Sous MySQL : mysql -u root banking_development;
    • Sous SQlite3 : sqlite3 db/development.sqlite3
  • Identifier quelle est la version de migration actuelle :
    • select * from schema_info;
    • ou sinon select * from schema_migrations;
  • Lancer la migration voulue : rake db:migrate VERSION=3

ATTENTION de ne pas mettre d'espace après le '=' qui suit VERSION car sinon c'est interprété comme une absence de numéro de version, et par conséquent toute les migrations sont "défaites" un à une pour revenir à une base vierge !...

Ajouter des données

Pour ma part, je me suis posé la question d'ajouter des données via une migration que récemment (comprendre que ça n'a pas été un besoin immédiat)... Actuellement, la seule utilisation pertinente que je vois c'est pour des données qui doivent être présente au lancement de l'application (utilisation du site) : des données de type "référentiel", des données de paramétrage. Une autre façon de faire cela serait peut-être de créer une tâche Rake qui fait cela ?!...

class AddOpenForComments < ActiveRecord::Migration
  def self.up
    Article.find_all.each do |article|
      if article.comments.size == 0
        Comment.new do |comment|
          comment.name = 'Welcome.'
          comment.body = "Article '#{article.name}' is open for comments."
          article.comments << comment
          comment.save
          article.save
        end
      end
    end
  end

  def self.down
  end
end

Conventions

The two columns names chosen, created_at and updated_at carry special semantics for Rails. As with other "magic column names" (id, type, position, lock_version, parent_id>), Rails will use this names as a convention. In this case, it will automatically update with the timestamp of a row's creation or last update. It only requires the underlying database column to be capable of receiving a date, datetime, or string. The complete Rails convention is to use the _on suffix for date columns and the _at suffix for columns that include a time.


SQlite3

Voici quelques tips pour manipuler la base de données SQlite3 (par défaut sous Mac OS X)

$ sqlite3 db/development.sqlite3
sqlite> .mode column
sqlite> .header on

// Pour avoir la liste des commandes :
sqlite> .help 

// Pour avoir la liste des tables :
sqlite> .tables 

// Pour avoir le contenu d'une table :
sqlite> select * from my_table;


Voir aussi sqlite3: A command-line access program for SQLite databases


Ressources


Les Fixtures

Pour charger toutes les fxitures :

rake db:fixtures:load

Pour charger uniquement les fixtures qui alimentes les tables STARS et DISCOVERY :

rake db:fixtures:load FIXTURES=stars,discovery


Rake et Rakefile


Les vues

Divers

  • flash : variable très utile, elle permet d'envoyer à l'utilisateur un message depuis la couche controller, mais uniquement pour la durée de la prochaine requête :
    • flash[:notice]
    • flash[:error]
<html>
   ...
   <body>
      <%= content_tag ‘div’, h(flash[:notice]), :class => ‘notice’, :id => ‘notice’ if flash[:notice] %>
      <%= content_tag ‘div’, h(flash[:error]), :class => ‘notice error’, :id => ‘error’ if flash[:error] %>
      ...
      <%= yield :layout %>
   </body>
</html>

Les formulaires

Il faut distinguer deux types de formulaires dans Rails :

  1. Le formulaire associé à un objet d'un modèle : balise form_for
  2. Le formulaire associé à aucun objet, uniquement destiné à récupérer des données brute : balise form_tag

i18n (InternationalizatioN)


Routes

  • /config/routes.rb pour définir les routes , c'est à dire associer des URLs à des ressources
  • Cela permet d'utiliser des Paths et URLs : edit_user_path(33) (ou edit_user_url(33)) au lieu de /users/33/edit
  • rake routes pour obtenir la liste des chemins accessibles dans votre application.
  • http://guides.rubyonrails.org/routing.html

Editeur et IDE

TextMate (Mac)

Payant !


Eclipse

...


Aptana

...


Eclipse et le plugin Rails

...


JetBrain

IDEA IntelliJ et le plugin Rails

Payant !

Configurer le "Ruby SDK"

Avant de pouvoir créer un module/projet Ruby/Rails, IntelliJ va vous demander de renseigner le Ruby SDK :

  • Sous PC, il vous faudra pointer vers le répertoire d'installation de Ruby ou celui de Rails...
  • Sous Mac, il faut indiquer le répertoire /usr


RubyMine

  • Auto-complétion "intelligente"
  • Diagramme de dépendance des modèles
  • Navigation entre M, V et C + testSSS
  • Vue Rails logiques (MVC)
  • Raccourcis pour les tâches Rake
  • Générations Rails
  • Prise en charge avancée du XML
  • Support pour YAML
  • Support avancé pour LES tests (RSpec, Test::Unit, test/spec) avec une vue dédiée, des raccourcis dédiés, des lives templates
  • Édition avancée du RHTML (coloration syntaxique et complétion) et langages associes : JavaScript, HTML and CSS, et raccourcis dedies (visualisation dans différents browsers...)
  • Possibilité de déboguer dans du code Ruby intégré dans du RHTML



Installer l'environnement de développement


Versions de Ruby avec RVM

  • Voir sur la page Ruby...

Rake et Rakefile


En production avec Heroku

Ma première application en Rails

Voir aussi la page dédiée RailsFirstApp.

Pour créer le squelette de son application, depuis une console, se mettre dans le répertoire qui va contenir le répertoire racine de l'application :

> cd /projects
> rails banking
> cd banking


Cela va lancer la création du répertoire racine banking et de l'arborescence initiale avec les répertoire clefs et les fichiers nécessaires pour débuter.

Une fois dans le répertoire racine banking, voici les répertoires accessibles :

.
..
app
config
db
doc
lib
log
public
script
test
tmp
vendor

Nous verrons ces différents répertoires par la suite.

Voyons maintenant ce que nous obtenons avec ceci. Lançons un serveur depuis la racine de notre application.

banking> ruby script/server

Il ne vous reste plus qu'a ouvrir votre browser préféré et y indiquer l'URL de votre application :

http://localhost:3000/

Mise sous gestionnaire de version (Subversion)

Maintenant que nous venons d'exécuter notre premier test utilisateur avec succès, nous pouvons remonter nos sources dans le gestionnaire de version.

Commençons par créer le référentiel banking depuis une console :

>svnadmin create /Users/seiza/data/svn/rails-banking

Une fois ce référentiel créé, nous devons configurer les droits d'accès. Depuis le répertoire /Users/seiza/data/svn/rails-banking, éditer les fichiers suivants :

conf/svnserve.conf pour y ajouter/décommenter le code suivant :

realm = Banking Repository
password-db = passwd
anon-access = read
auth-access = write

conf/passwd (nom indiqué ci dessus en face de l'entré password-db) pour y ajouter le code suivant sous la catégorie [users] :

wayne=batman

Il ne reste plus qu'a lancer le serveur Svnserve (depuis une console) en indiquant le chemin du répertoire contenant les référentiels (et non pas directement le répertoire du référentiel) :

>svnserve -d -r /Users/seiza/data/svn

Nous pouvons maintenant mettre en place la structure racine préconisée par Subversion, éventuellement à l'aide de notre client SVN préféré. Avec svnX, dans la fenêtre Repositories, cliquer sur le "+" puis entrez les valeurs suivantes :

  • Name : Banking
  • Path : rails-banking
  • User : wayne
  • Pass : batman

Puis :

  • Double-cliquer sur la ligne du repository "Banking" pour faire apparaître la fenêtre du projet.
  • Cliquer sur le bouton "svn mkdir" et créer dans le répertoire "root" les 3 répertoires ayant comme "target name" :
    • trunk
    • branches
    • tags
  • Après avoir saisi un commentaire (ex: "Création de la structure intiale.")
  • Vous pouvez faire commit.

Vous voyez maintenant apparaître les 3 répertoires dans la fenêtre svnX du projet "Banking".

Il ne nous reste plus qu'a importer la structure générée par Rails dans ce nous projet SVN, et plus particulièrement dans le répertoire "trunk". Ne sachant le faire directement dans svnX (est-ce possible ?), je vais procéder par la ligne de commande :

> svn import /Users/seiza/projects/banking/ file:///Users/seiza/data/svn/rails-banking/trunk/ 
--message "Import de la structure generee par Rails."

NOTE : Cette ligne de commande est a saisir sur une ligne unique (l'argument "--message" à la suite de ".../trunk/") !

Un rafraîchissement dans svnX vous montrera l'arborescence Rails dans le projet "Banking", preuve que cela a fonctionné correctement !


Tests (TDD... BDD) et Intégration Continue


Fonctionnalités

i18n - internationalisation


Login

Il existe plusieurs generators en fonction du niveau de sécurité que l'on souhaite :


Librairies


Ecosystème

Ressources

  • ...