-
Notifications
You must be signed in to change notification settings - Fork 36
koe
Kaikki tehtävät liittyvät koepaperin lopusta löytyvään koodiin.
Kirjoita jokaiseen palauttamaasi paperiin nimesi ja opiskelijanumerosi sekä kurssin nimi.
Selitä jokaisessa tehtävässä asiat kooditasolla sekä abstraktimmalla tasolla, eli selitä myös mikä on kunkin tehtävän kannalta relevantin sovelluksen komponentin rooli toiminnallisuuden kannalta.
Kokeessa on jaossa 15 pistettä. Koeaika on 150 minuuttia. Käytettävissäsi on siis keskimäärin 10 minuttia per piste, eli älä juutu liian kauaksi aikaa mihinkään yksittäiseen tehtävään!
HUOM: Kaikki tehtävät liittyvät koepaperin lopusta löytyvään koodiin.
Tapahtuu HTTP GET -pyyntö osoitteeseen http://localhost:3000/departments/1
Selitä tarkasti mitä tapahtuu kun pyyntö saavuttaa sovelluksen (voit olettaa että pyyntö onnistuu).
HUOM: Kaikki tehtävät liittyvät koepaperin lopusta löytyvään koodiin.
Käyttäjä on navigoinut uuden laitoksen luomissivulle:
Kerro mitä kaikkea sovelluksessa tapahtuu lomakkeen (views/departments/new.html.erb) lähettämisen seurauksena.
Kerro myös tarkasti mitä tapahtuu, jos maan luominen epäonnistuu, ja mikä voi aiheuttaa epäonnistumisen (voit jättää huomioimatta tietoliikenneprotokollan tai palvelimen tasolla tapahtuvat ongelmat).
HUOM: Kaikki tehtävät liittyvät koepaperin lopusta löytyvään koodiin.
Kaikkien laitosten sivun _http://localhost:3000/departments näyttää seuraavalta:
Sivun toteutus ei ole tällä hetkellä suorituskyvyltään erityisen hyvä. Jos laitoksia olisi satoja ja opiskelijoita kymmeniä tuhansia, olisi sivu todennäköisesti erittäin hidas.
Kerro mitä ongelmia sivun toteutuksessa on suorituskyvyn kannalta ja millä Railsin tarjoamilla tekniikoilla näitä voidaan optimoida?
Mitkä ovat kunkin optimointitekniikan hyvät ja huonot puolet? Mitä muutoksia näiden käyttöönotto edellyttäisi koodin tasolla?
HUOM: Kaikki tehtävät liittyvät koepaperin lopusta löytyvään koodiin.
Selitä miten sovellusta laajennettaisiin siten, että mukaan tuotaisiin uusi käsite kerho (Club). Kerholla on nimi ja perustamisvuosi. Kerhossa voi olla jäsenenä useita opiskelijoita ja yksi opiskelija voi kuulua useisiin kerhoihin.
Vastauksessa ei ole tarvetta kertoa näyttöjen ja kontrollerien osalta tarvittavia muutoksia. Kiinnostuksen kohteena ovat nyt erityisesti laajennuksen aiheuttamat muutokset modeleihin ja tietokantatasolle sekä se miten nämä toteutetaan.
HUOM: Kaikki tehtävät liittyvät koepaperin lopusta löytyvään koodiin.
- Mitä tapahtuu kun selaimesta mennään osoitteeseen http://localhost:3000
- Selitä miten sovelluksen toiminta muuttuu, kun sovelluksen jokaiseen näkymään lisätään seuraava:
<%= session[:last] %>
- Mitä tapahtuu kun suoritetaan komento
rspec spec
# config/routes.rb
Rails.application.routes.draw do
get '/departments', to:'departments#index'
get '/departments/new', to:'departments#form_for_new'
post '/departments', to:'departments#create'
get '/departments/:id', to:'departments#show'
resources :students
root 'students#index'
end
# app/controllers/departments_controller.rb
class DepartmentsController < ApplicationController
def index
@departments = Department.all
end
def show
@department = Department.find(params[:id])
session[:last] = params[:id]
end
def form_for_new
@department = Department.new
render :new
end
def create
@department = Department.new(params.require(:department).permit(:name))
if @department.save
redirect_to departments_path, notice: 'Department was successfully created.'
else
render :new
end
end
end
# app/models/department.rb
class Department < ActiveRecord::Base
has_many :students
validates :name, uniqueness: true,
length: { minimum: 3 }
def total_credits
students.inject(0) { |sum, p| sum + p.credits }
end
end
# db/migrate/20160215142931_create_students_and_departments.rb
class CreateStudentsAndDepartments < ActiveRecord::Migration
def change
create_table :departments do |t|
t.string :name
end
create_table :students do |t|
t.string :name
t.integer :credits
t.integer :department_id
end
end
end
# app/views/departments/index.html.erb
<h1>Departments</h1>
<ul>
<% @departments.each do |dep| %>
<li> <%= dep.name %> credits total <%= dep.total_credits %> </li>
<% end %>
</ul>
# app/views/departments/new.html.erb
<h1>Create new department</h1>
<%= form_for(@department) do |f| %>
<% if @department.errors.any? %>
<% @department.errors.full_messages.each do |msg| %>
<p><%= msg %></p>
<% end %>
<% end %>
Name: <%= f.text_field :name %> <br>
<%= f.submit %>
<% end %>
# app/views/departments/show.html.erb
<h2> <%= @department.name %> </h2>
<ul>
<% @department.students.each do |student| %>
<li> <%= student.name %> </li>
<% end %>
</ul>
# spec/features/departments_spec.rb
require 'rails_helper'
describe "Departments" do
before :each do
d = Department.create name: "tktl"
d.students.create name: "Chang", credits: 100
end
it "are shown" do
visit departments_path
expect(page).to have_content "tktl credits total 100"
end
it "can be added" do
visit departments_new_path
fill_in('department_name', with: "math")
click_button("Create Department")
expect(Department.count).to eq 1
end
end