Skip to content

Instantly share code, notes, and snippets.

@thibaudgg
Last active June 16, 2017 09:08
Show Gist options
  • Save thibaudgg/99ae13f20e2e43af3724864dd412be15 to your computer and use it in GitHub Desktop.
Save thibaudgg/99ae13f20e2e43af3724864dd412be15 to your computer and use it in GitHub Desktop.
Exam / MAS-RAD / Ruby on Rails / 2017

Exam / MAS-RAD / Ruby on Rails / 2017

Étudiant: VOTRE_NOM_ET_PRENOM

Marche à suivre

  1. Télécharger cette donnée sur votre ordinateur.
  2. Éditer le fichier exam.md avec vos réponses (Nom+Prénon, 4 Questions et 3 exercises).
  3. Envoyer votre fichier à thibaud@thibaud.gg.

Barème

Le barème pour les 16 points de l'exam: http://ibaremes.ch/?m=16&b=10&s=60.

Questions

Question 1 (2pts)

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

Question 2 (1pt)

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

Question 3 (2pts)

À quoi servent les sessions dans Ruby on Rails et où sont-elles sauvegardées par défaut?

  1. Garder un état persistent entre plusieurs requêtes HTTP (state vs stateless)
  2. Cookie

Question 4 (2pts)

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

Exercises

Exercise 1 (3pts)

É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

Exercise 2 (3pts)

É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

Exercise 3 (3pts)

É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 %>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment