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
2. Installation et test de ROR (première partie)
3. Chapitre un, une première mini-application
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 :
Quelle version de Ruby est installée dans les salles du département informatique de la faculté des sciences d'Angers ?
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" ?
Et le deuxième exemple standard, versions tdm.rb et tdm2.rb ? Quelle version est la plus fidèle à l'esprit de Ruby ?
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 : masquer la solution
Voici les réponses aux questions :
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.
Oui, l'exemple standard bonjour.rb fonctionne tel quel, même sans la première ligne require "date".
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.
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.0Partie 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.0Voici ce qu'on devrait obtenir :
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.0Partie 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.txtQuel est le message d'avertissement si on exécute ensuite
rake db:setupExécuter alors
rake db:migrate rake db:setupQuels 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.0Qu'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 : masquer la 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.1A 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 filesLa 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 existsA 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 :
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 :
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 : masquer la 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 :
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 : masquer la 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 : masquer la 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 : masquer la solution
Not yet!
Code-source PHP de cette page ; code Javascript associé.
Retour à la page principale de (gH)