Skip to content

erilliskoe21 4 2017

Matti Luukkainen edited this page Apr 21, 2017 · 2 revisions

Web-palvelinohjelmointi Ruby on Rails, erilliskoe 21.4.2017

Kaikki tehtävät liittyvät koepaperin lopusta löytyvään koodiin.

Kirjoita jokaiseen palauttamaasi paperiin nimesi ja opiskelijanumerosi sekä kurssin nimi.

tehtävä 1 (2p)

HUOM: Kaikki tehtävät liittyvät koepaperin lopusta löytyvään koodiin.

Tapahtuu HTTP GET -pyyntö osoitteeseen http://localhost:3000/countries/1

Selitä tarkasti mitä tapahtuu kun pyyntö saavuttaa sovelluksen (voit olettaa että pyyntö onnistuu).

Kerro samalla mitä tarkoittaa MVC-arkkitehtuuri ja miten se liittyy sovelluksen tämän tehtävän kannalta relevantteihin komponentteihin.

tehtävä 2 (3p)

HUOM: Kaikki tehtävät liittyvät koepaperin lopusta löytyvään koodiin.

Käyttäjä on navigoinut uuden maan luomissivulle:

kuva

Kerro mitä kaikkea sovelluksessa tapahtuu lomakkeen (views/countries/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).

tehtävä 3 (4p)

HUOM: Kaikki tehtävät liittyvät koepaperin lopusta löytyvään koodiin.

Kaikkien maiden sivun http://localhost:3000/countries näyttää seuraavalta:

kuva

Sivun toteutus ei ole tällä hetkellä suorituskyvyltään erityisen hyvä. Jos maita olisi satoja ja kaupunkeja 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?

tehtävä 4 (3p)

HUOM: Kaikki tehtävät liittyvät koepaperin lopusta löytyvään koodiin.

Selitä miten sovellusta laajennettaisiin siten, että mukaan tuotaisiin uusi käsite liitto (Union). Liitolla on nimi ja perustamisvuosi. Liitossa voi olla jäsenenä useita maita ja yksi maa voi kuulua useisiin liittoihin (esm. Saksa kuuluu sekä Natoon että Euroopan Unioniin ja molemmissa näissä on jäsenenä useita maita).

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.

tehtävä 5 (3p)

Tehdään tehtäväpaperin lopun koodin luokkaan CountriesController seuraava lisäys

class CountriesController < ApplicationController
  before_action :do_stuff, only: [:index, show]

  # ...

  def do_stuff
    session[:cnt] = ( session[:cnt] || 0 ) + 1
  end
end

ja lisätään tiedostoon view/layouts/application.erb.html seuraava

 <%= session[:cnt] %>

Kerro tarkasti miten lisäykset vaikuttavat ohjelman toimintaan.

Kaikkin kokeen tehtäviin liittyvä ohjelmakoodi

# config/routes.rb

Rails.application.routes.draw do
  get '/countries', to:'countries#index'
  get '/countries/new', to:'countries#new'
  post '/countries', to:'countries#create'
  get '/countries/:id', to:'countries#nayta'

  resources :cities
end


# app/controllers/countries_controller.rb

class CountriesController < ApplicationController
  def index
    @countries = Country.all
  end

  def nayta
    @country = Country.find(params[:id])
  end

  def new
    @country = Country.new
  end

  def create
    @country = Country.new(params.require(:country).permit(:name))

    if @country.save
      redirect_to countries_path, notice: 'Country was successfully created.'
    else
      render 'new'
    end
  end

# app/models/country.rb

class Country < ActiveRecord::Base
  has_many :cities

  validates :name, uniqueness: true,
                   length: { minimum: 3 }

  def population
    cities.map{ |city| city.population }.sum
  end
end

# db/migrate/20150215142931_create_cities_and_countries.rb

  def change
    create_table :cities do |t|
      t.string :name
      t.integer :population
      t.integer :country_id
    end

    create_table :countries do |t|
      t.string :name
    end
  end
# app/views/countries/index.html.erb

<h1>Countries</h1>

<ul>
  <% @countries.each do |country| %>
    <li> <%= country.name %> population <%= country.population %> </li>
  <% end %>
</ul>

# app/views/countries/new.html.erb

<h1>Create a new country</h1>

<%= form_for(@country) do |f| %>
  <% if @country.errors.any? %>
      <% @country.errors.full_messages.each do |msg| %>
        <p><%= msg %></p>
      <% end %>
  <% end %>

  Name: <%= f.text_field :name %> <br>
  <%= f.submit %>
<% end %>

# app/views/countries/show.html.erb

<h2> <%= @country.name %> </h2>

<ul>
  <% @country.cities.each do |city| %>
    <li> <%= city.name %> </li>
  <% end %>
</ul>