-
Notifications
You must be signed in to change notification settings - Fork 16
erilliskoe21 4 2017
Kaikki tehtävät liittyvät koepaperin lopusta löytyvään koodiin.
Kirjoita jokaiseen palauttamaasi paperiin nimesi ja opiskelijanumerosi sekä kurssin nimi.
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.
HUOM: Kaikki tehtävät liittyvät koepaperin lopusta löytyvään koodiin.
Käyttäjä on navigoinut uuden maan luomissivulle:
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).
HUOM: Kaikki tehtävät liittyvät koepaperin lopusta löytyvään koodiin.
Kaikkien maiden sivun http://localhost:3000/countries näyttää seuraavalta:
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?
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.
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.
# 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>