Étudiant: VOTRE_NOM_ET_PRENOM
- Télécharger cette donnée sur votre ordinateur.
- Éditer le fichier
exam.md
avec vos réponses (Nom+Prénon, 4 Questions et 3 exercises). - Envoyer votre fichier à [email protected].
Le barème pour les 16 points de l'exam: http://ibaremes.ch/?m=16&b=10&s=60.
Donner deux atouts/principes du framework Ruby on Rails:
- Offrir un environnement complet de développement (full stack)
- Avoir un full stack cohérent avec plein de possibilité par défault
- Convention over Configuration
- Don't Repeat Yourself
Quel est le nom de l'outil (pas le nom du fichier) qui permet de gérer les dépendances (gems) d'une application Ruby on Rails?
Bundler
À quoi servent les sessions dans Ruby on Rails et où sont-elles sauvegardées par défaut?
- Garder un état persistent entre plusieurs requêtes HTTP (state vs stateless)
- Cookie
Donner un avantage et un inconvénient des system tests par rapport aux controller tests (fonctional test) ou model tests (unit test):
- Couvre le stack complet de l'application, interaction avec le navigateur, support javascript
- Les system tests sont lents
Étant donné le fichier de migration suivant, modifier les deux models pour que les validations et associations soient correctes.
# DO NOT MODIFY THIS MIGRATION
class CreateArtistsAndBooks < ActiveRecord::Migration[5.1]
def change
create_table :artists do |t|
t.string :name, null: false
t.string :password_digest, null: false
t.string :email, null: false
t.integer :drawings_count, null: false, default: 0
t.timestamps
end
add_index :artists, :email, unique: true
create_table :drawings do |t|
t.string :title, null: false
t.integer :price
t.references :artist, foreign_key: true, null: false
t.timestamps
end
end
end
# MODIFY THESE MODELS
# app/models/artist.rb
class Artist < ApplicationRecord
has_secure_password
has_many :drawings
validates :email, uniqueness: true, presence: true
validates :name, presence: true
end
# app/models/drawing.rb
class Drawing < ApplicationRecord
belongs_to :artist, counter_cache: true
validates :title, presence: true
validates :price, numericality: { only_integer: true }
end
Étant donné l'integration test suivant, modifier le controller pour que le test passe avec succès.
# DO NOT MODIFY THIS TEST
# test/integration/books_test.rb
require 'test_helper'
class BooksTest < ActionDispatch::IntegrationTest
test 'can create a book' do
post '/books',
params: {
book: {
title: 'Meditations',
author: 'Marcus Aurelius'
}
}
assert_redirected_to '/books'
follow_redirect!
assert_response :success
assert_select '.flash.notice', 'Book Meditations created!'
assert_equal 'Marcus Aurelius', Book.last.author
end
end
# MODIFY THIS CONTROLLER
# app/controllers/books_controller.rb
class BooksController < ApplicationController
# POST /books
def create
@book = Book.create!(book_params)
redirect_to books_url, notice: "Book #{@book.title} created!"
end
private
def book_params
params.require(:book).permit(:title, :author)
end
end
Étant donné le system test suivant et les models de l'exercise 1, modifier la view pour que le test passe avec succès.
# DO NOT MODIFY THIS TEST
# test/system/drawings_test.rb
require 'application_system_test_case'
class DrawingsTest < ApplicationSystemTestCase
test 'drawing creation' do
visit '/drawings/new'
assert_selector 'h1', 'New Drawing'
fill_in 'Title', with: 'Champ de blé avec cyprès'
fill_in 'Price', with: '57000000'
select 'Vincent van Gogh', from: 'Artist'
click_button 'Create Drawing'
assert_selector '.flash.notice', 'Drawing created!'
end
end
<!-- MODIFY THIS VIEW -->
<!-- app/views/drawings/new.html.erb -->
<h1>New Drawing</h1>
<%= form_with(model: @drawing, local: true) do |f| %>
<div class="field">
<%= f.label :title %><br />
<%= f.text_field :title, id: 'drawing_title' %>
</div>
<div class="field">
<%= f.label :price %><br />
<%= f.number_field :price, id: 'drawing_price' %>
</div>
<div class="field">
<%= f.label :artist %><br />
<%= f.select :artist_id, Artist.pluck(:name, :id), id: 'drawing_artist' %>
</div>
<div class="actions">
<%= f.submit 'Create Drawing' %>
</div>
<% end %>