Valid XHTML     Valid CSS2    

DECRA, T.P. 6 :

     MVC en Ruby via ROR

Décomposition, Conception et Réalisation d'Applications

                    gilles.hunault "at" univ-angers.fr

Table des matières cliquable

  1. Découverte de Ruby

  2. Installation et test de ROR (première partie)

  3. Chapitre un, une première mini-application

  4. Chapitre deux, une vraie application

  5. Tout le reste du turoriel

  6. Ajout de fonctionalités

Il est possible d'afficher toutes les solutions via ?solutions=1 et de les masquer via ?solutions=0.

 

1. Découverte de Ruby

Commencer par lire le tuteur Ruby puis répondre aux questions suivantes :

  1. Quelle version de Ruby est installée dans les salles du département informatique de la faculté des sciences d'Angers ?

  2. Est-ce que le premier exemple standard de notre tuteur, bonjour.rb, fonctionne tel quel  ? A-t-on besoin de la première ligne require "date" ?

  3. Et le deuxième exemple standard, versions tdm.rb et tdm2.rb ? Quelle version est la plus fidèle à l'esprit de Ruby ?

  4. Est-ce que les exemples complémentaires nommés respectivement sql.rb, ndjpm.rb et demo_xml.rb fonctionnent tels quels  ?

Est-ce qu'il existe des Jupyter Notebooks pour Ruby ?

Solution :  

Voici les réponses aux questions :

  1. Comme le montre la commande ruby --version, c'est la version 2.3.1p112 qui est installée dans les salles informatiques du département informatique de la faculté des sciences d'Angers.

  2. Oui, l'exemple standard bonjour.rb fonctionne tel quel, même sans la première ligne require "date".

  3. Les deux versions de la table de multiplication fonctionnent tels quels. La deuxième version, qui définit une méthode entier? dans la classe String correspond sans doute plus à l'esprit de Ruby.

  4. A priori, seul l'exemple ndjpm.rb fonctionne directement. Les exemples sql.rb et demo_xml.rb requièrent une installation.

    
         $gh> ruby sql.rb
         
         /usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- mysql (LoadError)
            from /usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
            from sql.rb:3:in `<main>'
         
         $gh> ruby ndjpm.rb
         
         [ndjpm] il y a 31 jours pour le mois numero 5
         
         $gh> ruby demo_xml.rb
         
         /usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- xml/xslt (LoadError)
            from /usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
            from demo_xml.rb:4:in `<main>'
         
    

Oui, il existe des Jupyter Notebooks pour Ruby, comme l'indique la page jupyter-kernels mais l'installation n'est pas des plus aisées pour un environnement universitaire et aucun docker ne semble pour l'instant ne semble être disponible...

 

2. Installation et test de ROR (première partie)

Partie 2.1

Quelle version de gem est installée ? Est-ce que la commande gem install rails --version 3.0.5 s'exécute correctement ? Pourquoi ? Comment corriger ce problème ? Vérifier ensuite que le code suivant produit une version minimale d'une application Ruby :


         rails new miniROR
         cd miniROR
         bundle install
         rake db:setup
         rake db:migrate
         rake db:setup
         echo http://localhost:3000
         rails server -p 3000  -b 0.0.0.0
     

Partie 2.2

Si ce n'est pas le cas, est-ce que la commande gem install rails --version 5.2.1 s'exécute correctement ? Vérifier ensuite que le code suivant produit une version minimale d'une application Ruby :


         rails new miniROR
         cd miniROR
         bundle install
         rake db:setup
         rake db:migrate
         rake db:setup
         echo http://localhost:3000
         rails server -p 3000  -b 0.0.0.0
     

Voici ce qu'on devrait obtenir :

            non su

Partie 2.3

Si cela ne fonctionne toujours pas, lancer la commande _ruby_on_rails qui, dans les salles du département informatique de l'université d'Angers lance un docker avec ruby et rails préconfigurés.

Quelle est alors la version de ruby, de gem et de rails ?

Exécuter les commandes suivantes et vérifier que le serveur est disponible à l'adresse http://localhost:3000.


         rails new sample_app
         cd sample_app
         rake db:migrate
         rake db:setup
         rails server -p 3000 -b 0.0.0.0
     

Partie 2.4

Quels sont les répertoires et les fichiers créés (en identifiez-vous certains ?) si on exécute


     rails new demo
     cd demo
     bundle install
     find . > ror-lst1.txt
     

Quel est le message d'avertissement si on exécute ensuite


     rake db:setup
     

Exécuter alors


     rake db:migrate
     rake db:setup
     

Quels fichiers ont été alors créés (à mettre dans ror-lst2.txt) ?

Exécuter maintenant


     echo http://localhost:3000
     rails server -p 3000 -b 0.0.0.0
     

Qu'affiche la console si on ouvre la page index du serveur ?

Que contient le fichier Gemfile et quels groupes sont définis dans ce fichier ?

Solution :  

Partie 2.1

La commande gem --version indique que la version 2.5.2.1 est installée.

La commande gem install rails --version 3.0.5 ne s'exécute pas correctement parce qu'on essaie d'écrire dans des répertoires système sans être root. En principe, cette commande devrait être précédée de sudo. Comme vous n'avez pas les droits d'administration dans les salles informatiques du département informatique de la faculté des sciences d'Angers, il faudrait suivre la procédure indiquée ici. Malheureusement, toujours à cause des droits d'accès, cela ne fonctionne pas dans nos salles informatiques.

Partie 2.2

Cela ne fonctionne pas non plus avec gem install rails --version 3.0.5.

Partie 2.3

Une fois le dockeur lancé, les commandes ruby --version, gem --version et rails --version affichent les numéros de version suivantes :


     $gh> ruby --version
     
     ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]
     
     $gh> gem --version
     
     2.7.8
     
     $gh> rails --version
     
     Rails 5.2.1
     

A la suite du bundle install on dispose de toute une arborescence (44 directories, 61 files) :


     .
     +-- app
     |   +-- assets
     |   |   +-- config
     |   |   |   +-- manifest.js
     |   |   +-- images
     |   |   +-- javascripts
     |   |   |   +-- application.js
     |   |   |   +-- cable.js
     |   |   |   +-- channels
     |   |   +-- stylesheets
     |   |       +-- application.css
     |   +-- channels
     |   |   +-- application_cable
     |   |       +-- channel.rb
     |   |       +-- connection.rb
     |   +-- controllers
     |   |   +-- application_controller.rb
     |   |   +-- concerns
     |   +-- helpers
     |   |   +-- application_helper.rb
     |   +-- jobs
     |   |   +-- application_job.rb
     |   +-- mailers
     |   |   +-- application_mailer.rb
     |   +-- models
     |   |   +-- application_record.rb
     |   |   +-- concerns
     |   +-- views
     |       +-- layouts
     |           +-- application.html.erb
     |           +-- mailer.html.erb
     |           +-- mailer.text.erb
     +-- bin
     |   +-- bundle
     |   +-- rails
     |   +-- rake
     |   +-- setup
     |   +-- spring
     |   +-- update
     |   +-- yarn
     +-- config
     |   +-- application.rb
     |   +-- boot.rb
     |   +-- cable.yml
     |   +-- credentials.yml.enc
     |   +-- database.yml
     |   +-- environment.rb
     |   +-- environments
     |   |   +-- development.rb
     |   |   +-- production.rb
     |   |   +-- test.rb
     |   +-- initializers
     |   |   +-- application_controller_renderer.rb
     |   |   +-- assets.rb
     |   |   +-- backtrace_silencers.rb
     |   |   +-- content_security_policy.rb
     |   |   +-- cookies_serializer.rb
     |   |   +-- filter_parameter_logging.rb
     |   |   +-- inflections.rb
     |   |   +-- mime_types.rb
     |   |   +-- wrap_parameters.rb
     |   +-- locales
     |   |   +-- en.yml
     |   +-- master.key
     |   +-- puma.rb
     |   +-- routes.rb
     |   +-- spring.rb
     |   +-- storage.yml
     +-- config.ru
     +-- db
     |   +-- seeds.rb
     +-- Gemfile
     +-- Gemfile.lock
     +-- lib
     |   +-- assets
     |   +-- tasks
     +-- log
     +-- package.json
     +-- public
     |   +-- 404.html
     |   +-- 422.html
     |   +-- 500.html
     |   +-- apple-touch-icon.png
     |   +-- apple-touch-icon-precomposed.png
     |   +-- favicon.ico
     |   +-- robots.txt
     +-- Rakefile
     +-- README.md
     +-- storage
     +-- test
     |   +-- application_system_test_case.rb
     |   +-- controllers
     |   +-- fixtures
     |   |   +-- files
     |   +-- helpers
     |   +-- integration
     |   +-- mailers
     |   +-- models
     |   +-- system
     |   +-- test_helper.rb
     +-- tmp
     |   +-- cache
     |   |   +-- assets
     |   +-- storage
     +-- tree.txt
     +-- vendor
     
     44 directories, 62 files
     

La liste des fichiers, fournie ci-dessous, une fois triées, est dans ror-lst1.txt.

Si on exécute rake db:setup, Rails se plaint que la base n'est pas créée :


     $gh> rake db:setup
     
     Created database 'db/development.sqlite3'
     Created database 'db/test.sqlite3'
     /home/gh/Tmp/ror/mini/pomme/db/schema.rb doesn't exist yet.
     Run `rails db:migrate` to create it, then try again.
     If you do not intend to use a database, you should instead alter
     /home/gh/Tmp/ror/mini/pomme/config/application.rb to limit the frameworks that will be loaded.
     
     

Avec les deux commandes rake suivantes, tout est OK :


     $gh> rake db:migrate
     
     $gh> rake db:setup
     
     Database 'db/development.sqlite3' already exists
     Database 'db/test.sqlite3' already exists
     

A la suite du lancement du serveur via rails server de nouveaux fichiers sont créés, notamment dans le répertoire tmp/ :

Il est sans doute prudent de passer ici par diff pour visualiser les différences :

La console affiche alors les requêtes HTPP et la réponse du serveur :


     $gh> rails server -p 3000 -b 0.0.0.0
     
     => Booting Puma
     => Rails 5.2.1 application starting in development
     => Run `rails server -h` for more startup options
     Puma starting in single mode...
     * Version 3.12.0 (ruby 2.5.3-p105), codename: Llamas in Pajamas
     * Min threads: 5, max threads: 5
     * Environment: development
     * Listening on tcp://0.0.0.0:3000
     Use Ctrl-C to stop
     Started GET "/" for 127.0.0.1 at 2018-11-19 18:28:30 +0100
     Processing by Rails::WelcomeController#index as HTML
       Rendering /home/gh/.rvm/gems/ruby-2.5.3/gems/railties-5.2.1/lib/rails/templates/rails/welcome/index.html.erb
       Rendered /home/gh/.rvm/gems/ruby-2.5.3/gems/railties-5.2.1/lib/rails/templates/rails/welcome/index.html.erb (1.8ms)
     Completed 200 OK in 11ms (Views: 4.3ms | ActiveRecord: 0.0ms)
     

Le fichier Gemfile contient les noms de librairies utilisées :


     source 'https://rubygems.org'
     git_source(:github) { |repo| "https://github.com/#{repo}.git" }
     
     ruby '2.5.3'
     
     # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
     gem 'rails', '~> 5.2.1'
     # Use sqlite3 as the database for Active Record
     gem 'sqlite3'
     # Use Puma as the app server
     gem 'puma', '~> 3.11'
     # Use SCSS for stylesheets
     gem 'sass-rails', '~> 5.0'
     # Use Uglifier as compressor for JavaScript assets
     gem 'uglifier', '>= 1.3.0'
     # See https://github.com/rails/execjs#readme for more supported runtimes
     # gem 'mini_racer', platforms: :ruby
     
     # Use CoffeeScript for .coffee assets and views
     gem 'coffee-rails', '~> 4.2'
     # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
     gem 'turbolinks', '~> 5'
     # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
     gem 'jbuilder', '~> 2.5'
     # Use Redis adapter to run Action Cable in production
     # gem 'redis', '~> 4.0'
     # Use ActiveModel has_secure_password
     # gem 'bcrypt', '~> 3.1.7'
     
     # Use ActiveStorage variant
     # gem 'mini_magick', '~> 4.8'
     
     # Use Capistrano for deployment
     # gem 'capistrano-rails', group: :development
     
     # Reduces boot times through caching; required in config/boot.rb
     gem 'bootsnap', '>= 1.1.0', require: false
     
     group :development, :test do
       # Call 'byebug' anywhere in the code to stop execution and get a debugger console
       gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
     end
     
     group :development do
       # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
       gem 'web-console', '>= 3.3.0'
       gem 'listen', '>= 3.0.5', '< 3.2'
       # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
       gem 'spring'
       gem 'spring-watcher-listen', '~> 2.0.0'
     end
     
     group :test do
       # Adds support for Capybara system testing and selenium driver
       gem 'capybara', '>= 2.15'
       gem 'selenium-webdriver'
       # Easy installation and use of chromedriver to run system tests with Chrome
       gem 'chromedriver-helper'
     end
     
     # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
     gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
     

Les groupes implémentés sont development et test par défaut.

 

3. Chapitre un, une première mini-application

On ne va pas suivre ici la version française du tutoriel qui n'est pas à jour (mais vous pouvez vous en servir lorsque vous ne comprenez pas les termes anglais) mais plutôt la version anglaise du tutoriel.

Lire le chapitre 1 jusqu'à la fin de la section 1.3 (aucune manipulation pour l'instant).

Attention : pour ce qui suit, il ne faut pas créer le répertoire ~/environment comme indiqué dans le tuteur. Vous pouvez vous contenter du répertoire environment dans le répertoire Mes_projets_ruby que vous retrouvez aussi dans votre home directory suite au lancement du docker. De même, vous ne devez pas exécuter rails server comme indiqué dans le tutorial, mais rails server -p 3000 -b 0.0.0.0 sous peine de ne pouvoir accéder au serveur.

Continuer alors la lecture du chapitre 1, exécuter les commandes indiquées jusqu'à la fin de la section 1.3.2 pour créer l'application hello_app et vérifier que la commande rails server -p 3000 -b 0.0.0.0 affiche bien ce qu'on attend.

Voici ce qu'on doit obtenir :

            non su

Effectuer les manipulations de la section 1.3.3 (fichiers application_controller.rb et routes.rb) pour que la commande rails server -p 3000 -b 0.0.0.0 affiche désormais hello , world! et bonjour à tous !!.

Voici ce qu'on doit obtenir :

            non su

Lire ensuite la fin du chapitre 1 (section 1.4 et suivantes) mais sans réaliser les manipulations git, bitbucket ou heroku. Par contre on essaiera de comprendre ce qu'elles représentent.

Solution :  

Il n'y a aucune question ici !

 

4. Chapitre deux, une vraie application

Lire le chapitre 2 et réaliser toutes les manipulations proposées sauf la modification du fichier Gemfile et toujours sans les parties git, bitbucket ou heroku jusqu'à la section 2.3.1 incluse. On ne saisira pas non plus le numéro de version _5.1.6_ dans les commandes rails. Après les commandes rails generate scaffold... et rails db:migrate, on créera quelques utilisateurs et des micro-messages, comme ci-dessous :

            non su

            non su

            non su

            non su

            non su

            non su

Vérifier ensuite que vous arrivez à imposer une longueur maximale de micropost de 140 caractères comme indiqué dans la section 2.3.2. Lire (sans manipulations) la section 2.3.5 puis essayer de trouver où est la base de données utilisées. Quel est son schéma (iste et structure des tables) ?

Solution :  

La base de données est accessible via le chemin db/development.sqlite3. C'est du sqlite, donc .schema affiche la structure de la base et des tables...

 

5. Tout le reste du turoriel

Continuer les chapitres et essayer de réaliser un maximum de manipulations. Vous pouvez essayer de faire un résumé des commandes et des gemmes utilisées.

Solution :  

Voici la plupart des commandes et des gemmes utilisées :


     commandes
     ----------
     
     rails new
     bundle install
     rake db:migrate
     rake db:setup
     rails server
     bundle exec rspec [spec/]
     bundle exec rake test
     rake db:populate
     bundle exec annotate user
     
     rails console --sandbox
     rails generate model user name:string  # ==> user.rb
     rails generate controller users new edit show # ==> app/controllers/users_controller.rb
     # ==> app/views/users/new.html.erb
     rspec_rails dans Gemfile
     ruby -I test test/unit/model_test.rb
     rspec spec/models/Utilisateur-spec.rb -e "titre souhaité" # tests unitaires
     spec/controller # tests d'intégration
     app/models/Utilisateur.rb (amzil)
     validates dans le modèle
     autotest spark rspec
     rake test
     rails generate rspec:install
     
     gemmes
     ------
     
     abstract
     rspec
     rspec-rails
     rspec-core
     rake
     faker ==> génére des utilisateurs
     webrat ==> tests d'acceptations robustes
     carrierwave ==> téléchargement de fichiers
     paperclip idem
     wickedpdf
     scruffy ==> générer des png, des svg
     minitest
     annotate
     prawn
     prawn-table
     factory_girl_rails
     will_paginate
     date-validator
     spork
     gruff
     autotest
     growl
     rdoc
     sdoc
     uglifier
     coffee-rails
     turbobilder
     jbuilder
     capybara
     selenium
     web-console
     Codacy-coverage
     Redgreen
     spring
     Strong_parameters
     Test-unit
     Zentest
     better_errors
     simple_form
     googlecharts
     bcrypt-ruby # ==> pour les mots de passe
     sprockets
     jquery-rails
     

 

6. Ajout de fonctionalités

Compléter le site avec la saisie d'une date de naissance, le calcul et l'affichage de l'age des personnes, la saisie d'un nombre moyen de films vus par semaine (au cinéma, à la télé, sur ordinateur ou tablette...), l'affichage de l'indication j'aimerais lire plus de livres en mode oui/non et le dépot d'un CV au format PDF avec la consultation possible par les autres utilisateurs. Au passage, vous en profiterez pour traduire tous les affichages en français, histoire de prouver que vous savez d'où vient chaque page.

En option, implémentez aussi le service des pages en XHTML strict plutot qu'en HTML 5 (une validation sans erreur ni avertissement avec HTML Validator est conseillée), avec l'icone de validation associée, le pourcentage des gens qui aimeraient et qui n'aimeraient pas lire plus de livres, le masquage et l'affichage en Javascript de j'aimerais lire plus de livres pour ceux qui en lisent déjà suffisamment, une liste bien présentée disponible en PDF (création à la volée) de tous les utilisateurs, un graphique SVG qui fournit un box-plot des nombres de films par semaine, un graphique PNG de l'histogramme des fréquences des lecteurs et des non lecteurs...

Solution :  

Not yet!

 

       retour au plan de cours  

 

Code-source PHP de cette page ; code Javascript associé.

 

retour gH    Retour à la page principale de   (gH)