Wykład nr 6 Trasowanie i warstwa kontrolera routes.rb i ActionController

Podobne dokumenty
Wykład nr 7 Trasowanie i warstwa kontrolera routes.rb i ActionController

EPI: Interfejs Graficzny Wykład nr 4 Podstawy frameworku Rails

Programowanie w Ruby

Kurs języka Ruby. Ruby on Rails ActionPack

Modele danych walidacja widoki zorientowane na model

Testowanie aplikacji. Kurs języka Ruby

Gatesms.eu Mobilne Rozwiązania dla biznesu

Laboratorium nr 3 Podstawy Ruby on Rails

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

EPI: Interfejs Graficzny Wykład nr 8 Warstwa widoku

Laboratorium 7 Blog: dodawanie i edycja wpisów

EPI: Interfejs Graczny 2008/2009 dania HTTP oraz obsªuga stanu

Wykład 3 Inżynieria oprogramowania. Przykład 1 Bezpieczeństwo(2) wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Programowanie w Ruby

Ruby on Rails 2.1. Tworzenie nowoczesnych aplikacji internetowych

Architektury Usług Internetowych. Laboratorium 2 RESTful Web Services

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Plan. Stan sesji (1/2) Stan sesji (2/2) Stan sesji Tworzenie przycisku Integracja prostego formularza z raportem Tworzenie formularza z raportem

Aplikacje webowe. mgr inż. Aleksander Smywiński-Pohl. Elektroniczne Przetwarzanie Informacji

Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do

Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)

Podręcznik Integracji

Ruby i Ruby on Rails. Mateusz Drożdżyński

Języki programowania wysokiego poziomu. PHP cz.3. Formularze

Podstawy technologii WWW

ASP.NET MVC. Grzegorz Caban 20 stycznia 2009

Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka

Systemy internetowe. Wykład 5 Architektura WWW. West Pomeranian University of Technology, Szczecin; Faculty of Computer Science

Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do

Poznaj ASP.NET MVC. Kamil Cieślak Microsoft Student Partner

Programowanie w Ruby

Walidacja danych w ASP.NET MVC

Programowanie w Ruby

Realizacja Aplikacji Internetowych 2013 laboratorium cz. 2 K.M. Ocetkiewicz

Ruby on Rails. Wprowadzenie. Wydanie II

Program szkolenia: Symfony, nowoczesny framework PHP

Quiz Aplikacja internetowa

Technologie internetowe ASP.NET Core. Paweł Rajba

Sesje i logowanie. 1. Wprowadzenie

TOPIT Załącznik nr 3 Programowanie aplikacji internetowych

Aplikacje webowe z wykorzystaniem Node.js oraz Express

Wprowadzenie do Internetu Zajęcia 5

Tworzenie i wykorzystanie usług sieciowych

Gerard Frankowski, Zespół Bezpieczeństwa PCSS. Nowoczesne technologie bliżej nas Poznań,

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 4

PHP: bloki kodu, tablice, obiekty i formularze

Programowanie w Sieci Internet Python - c. d. Kraków, 28 listopada 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Aplikacje WWW - laboratorium

Zmienne i stałe w PHP

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Katalog książek cz. 3: Web Service

Internetowe bazy danych

Projektowani Systemów Inf.

Aktualizacja SMSFall v Data publikacji:

Aplikacje www laboratorium

INTERNETOWE BAZY DANYCH materiały pomocnicze - wykład VII


A Zasady współpracy. Ocena rozwiązań punktów punktów punktów punktów punktów

Backend Administratora

Ajax. 1. Wprowadzenie. 2. Aplikacja serwerowa

Kurs rozszerzony języka Python

Podstawy wzorca MVC MODEL KON- TROLER WIDOK. Odpowiada za wyświetlenie danych użytkownikowi. Zawiera dane aplikacji oraz jej logikę.

Budowa aplikacji ASP.NET z wykorzystaniem wzorca MVC

Języki skryptowe - PHP. PHP i bazy danych. Paweł Kasprowski. pawel@kasprowski.pl. vl07

Serwery aplikacji. dr Radosław Matusik. radmat

CouchDB. Michał Nowikowski

Platforma e-learningowa

Sprawozdanie nr 4. Ewa Wojtanowska

Wybrane działy Informatyki Stosowanej

Aplikacje internetowe - laboratorium

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

ym4r Google Maps w Ruby on Rails

Cemarol Sp. z o.o. Polityka prywatności (pliki cookies) 1. Informacje ogólne.

Serwis realizuje funkcje pozyskiwania informacji o użytkownikach i ich zachowaniach w następujący sposób:

Walidacja po stronie serwera Walidacja po stronie klienta:

Serwery aplikacji. dr Radosław Matusik. radmat

Dokumentacja REST API v 3.0

Jarosław Kuchta Administrowanie Systemami Komputerowymi. Internetowe Usługi Informacyjne

MVC w praktyce tworzymy system artykułów. cz. 2

Systemy internetowe. Wykład 3 PHP. West Pomeranian University of Technology, Szczecin; Faculty of Computer Science

Widoki zagnieżdżone, layout. 1. Wprowadzenie Repozytoria danych

System DiLO. Opis interfejsu dostępowego v. 2.0

Sieci komputerowe. Wykład 8: Warstwa zastosowań: FTP i HTTP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski

Dokumentacja Administratora portalu. aplikacji. Wirtualna szkoła

Laboratorium 6 Tworzenie bloga w Zend Framework

Instrukcja Użytkownika Systemu Zarządzania Tożsamością Wersja. 1.0

Comarch isklep24 Ulotka v. 5.1

Programowanie Komponentowe WebAPI

Architektura MVC w ASP.NET. Autor wykładu: Marek Wojciechowski

Full Stack JavaScript z Angular i Nest. Dni: 5. Opis: Adresaci szkolenia

Aplikacje WWW - laboratorium

Cookie Policy. 1. Informacje ogólne.

Polityka prywatności serwisu

Dokumentacja REST API v 3.0. Kraków, 7 marca FreshMail, ul. Fabryczna 20a, Kraków tel , freshmail.

ASP.NET MVC. Uwierzytelnianie i routing. Zaawansowane programowanie internetowe Instrukcja nr 6

Transkrypt:

Wykład nr 6 Trasowanie i warstwa kontrolera routes.rb i ActionController Elektroniczne Przetwarzanie Informacji Konsultacje: czw. 14.00-15.30, pokój 3.211

Plan prezentacji Wprowadzenie Trasowanie Warstwa kontrolera Obsługa stanu

MVC w RoR

Trasowanie config/routes.rb zastępuje rozwiązania typu mod_rewrite

Trasowanie config/routes.rb zastępuje rozwiązania typu mod_rewrite interpretuje żądania przychodzące do aplikacji

Trasowanie config/routes.rb zastępuje rozwiązania typu mod_rewrite interpretuje żądania przychodzące do aplikacji przekazuje żądania do kontrolera

Trasowanie config/routes.rb zastępuje rozwiązania typu mod_rewrite interpretuje żądania przychodzące do aplikacji przekazuje żądania do kontrolera pozwala na całkowite wyabstrahowanie mechanizmu tworzenia linków wewnątrz aplikacji

Trasowanie config/routes.rb zastępuje rozwiązania typu mod_rewrite interpretuje żądania przychodzące do aplikacji przekazuje żądania do kontrolera pozwala na całkowite wyabstrahowanie mechanizmu tworzenia linków wewnątrz aplikacji pozwala na tworzenie przyjaznych adresów URL /ksiazki/1-dziady-cz-iv /2011/11/11

Trasowanie config/routes.rb zastępuje rozwiązania typu mod_rewrite interpretuje żądania przychodzące do aplikacji przekazuje żądania do kontrolera pozwala na całkowite wyabstrahowanie mechanizmu tworzenia linków wewnątrz aplikacji pozwala na tworzenie przyjaznych adresów URL /ksiazki/1-dziady-cz-iv /2011/11/11 zbudowane w oparciu o REST

Trasowanie config/routes.rb zastępuje rozwiązania typu mod_rewrite interpretuje żądania przychodzące do aplikacji przekazuje żądania do kontrolera pozwala na całkowite wyabstrahowanie mechanizmu tworzenia linków wewnątrz aplikacji pozwala na tworzenie przyjaznych adresów URL /ksiazki/1-dziady-cz-iv /2011/11/11 zbudowane w oparciu o REST pozwala na automatyczne przekierowywanie żądań

Warstwa kontrolera ActionController reaguje na żądania przeglądarki

Warstwa kontrolera ActionController reaguje na żądania przeglądarki łączy warstwę modelu z warstwą widoku

Warstwa kontrolera ActionController reaguje na żądania przeglądarki łączy warstwę modelu z warstwą widoku definiuje akcje (jako metody Rubiego)

Warstwa kontrolera ActionController reaguje na żądania przeglądarki łączy warstwę modelu z warstwą widoku definiuje akcje (jako metody Rubiego) przyjmuje podstawowe założenia koncepcji REST

Warstwa kontrolera ActionController reaguje na żądania przeglądarki łączy warstwę modelu z warstwą widoku definiuje akcje (jako metody Rubiego) przyjmuje podstawowe założenia koncepcji REST każda akcja domyślnie posiada odpowiadający jej widok

Warstwa kontrolera ActionController reaguje na żądania przeglądarki łączy warstwę modelu z warstwą widoku definiuje akcje (jako metody Rubiego) przyjmuje podstawowe założenia koncepcji REST każda akcja domyślnie posiada odpowiadający jej widok filtry pozwalają na łatwe dodanie zadań do wybranych akcji, np. autoryzacja, kompresja

REST Representational State Transfer architektura zaprojektowana dla rozproszonych serwisów webowych, np.: Amazon S3 CKAN MongoDB

REST Representational State Transfer architektura zaprojektowana dla rozproszonych serwisów webowych, np.: Amazon S3 CKAN MongoDB wykorzystuje dobrze znane cechy protokołu HTTP adresy URL

REST Representational State Transfer architektura zaprojektowana dla rozproszonych serwisów webowych, np.: Amazon S3 CKAN MongoDB wykorzystuje dobrze znane cechy protokołu HTTP adresy URL czasowniki: GET, POST, PUT, DELETE

REST Representational State Transfer architektura zaprojektowana dla rozproszonych serwisów webowych, np.: Amazon S3 CKAN MongoDB wykorzystuje dobrze znane cechy protokołu HTTP adresy URL czasowniki: GET, POST, PUT, DELETE formaty: HTML, JSON, XML

REST Representational State Transfer architektura zaprojektowana dla rozproszonych serwisów webowych, np.: Amazon S3 CKAN MongoDB wykorzystuje dobrze znane cechy protokołu HTTP adresy URL czasowniki: GET, POST, PUT, DELETE formaty: HTML, JSON, XML pozostałe: proxy, firewall, caching, mime, etc.

REST Representational State Transfer architektura zaprojektowana dla rozproszonych serwisów webowych, np.: Amazon S3 CKAN MongoDB wykorzystuje dobrze znane cechy protokołu HTTP adresy URL czasowniki: GET, POST, PUT, DELETE formaty: HTML, JSON, XML pozostałe: proxy, firewall, caching, mime, etc. centralne pojęcie: zasób

REST zasady działania identyfikowanie zasobów poprzez adres URL

REST zasady działania identyfikowanie zasobów poprzez adres URL http://example.com/cars kolekcja zasobów

REST zasady działania identyfikowanie zasobów poprzez adres URL http://example.com/cars kolekcja zasobów http://example.com/cars/1 pojedynczy zasób

REST zasady działania identyfikowanie zasobów poprzez adres URL http://example.com/cars kolekcja zasobów http://example.com/cars/1 pojedynczy zasób odczytywanie/modyfikowanie zasobu z wykorzystaniem dokumentów opisujących stan <?xml version="1.0" encoding="utf-8"?> <book> <author-id type="integer">1</author-id> <id type="integer">1</id> <title>alef</title> </book>

REST zasady działania identyfikowanie zasobów poprzez adres URL http://example.com/cars kolekcja zasobów http://example.com/cars/1 pojedynczy zasób odczytywanie/modyfikowanie zasobu z wykorzystaniem dokumentów opisujących stan <?xml version="1.0" encoding="utf-8"?> <book> <author-id type="integer">1</author-id> <id type="integer">1</id> <title>alef</title> </book> CRUD czasowniki HTTP: GET, POST, PUT, DELETE

REST zasady działania identyfikowanie zasobów poprzez adres URL http://example.com/cars kolekcja zasobów http://example.com/cars/1 pojedynczy zasób odczytywanie/modyfikowanie zasobu z wykorzystaniem dokumentów opisujących stan <?xml version="1.0" encoding="utf-8"?> <book> <author-id type="integer">1</author-id> <id type="integer">1</id> <title>alef</title> </book> CRUD czasowniki HTTP: GET, POST, PUT, DELETE linki w dokumencie identyfikują inne możliwe akcje do wykonania

Plan prezentacji Wprowadzenie Trasowanie Warstwa kontrolera Obsługa stanu

Definicja trasowania plik config/routes.rb Library::Application.routes.draw do resources :books # wiele zasobów resources :authors do # zasoby zagnieżdżone resources :books end resource :user_session # jeden zasób root :to => 'books#index' # strona startowa post 'login' => "user_sessions#new" # określony kontroler i akcja # oraz zmiana adresu URL post 'logout' => "user_sessions#destroy", :as => :logout # zmiana adresu oraz # utworzenie helpera 'logout_path' end

Użycie trasowania helper link_to <%= link_to "książki", :controller => "books", :action => "index" %> <a href="/books">książki</a>

Użycie trasowania helper link_to <%= link_to "książki", :controller => "books", :action => "index" %> <a href="/books">książki</a> <%= link_to "książki", books_path %> <a href="/books">książki</a>

Użycie trasowania helper link_to <%= link_to "książki", :controller => "books", :action => "index" %> <a href="/books">książki</a> <%= link_to "książki", books_path %> <a href="/books">książki</a> <%= link_to "nowa książka", new_book_path %> <a href="/books/new">nowa książka</a>

Użycie trasowania helper link_to <%= link_to "książki", :controller => "books", :action => "index" %> <a href="/books">książki</a> <%= link_to "książki", books_path %> <a href="/books">książki</a> <%= link_to "nowa książka", new_book_path %> <a href="/books/new">nowa książka</a> <%= link_to @book.title, @book %> <a href="/books/1">mały Książę</a>

Użycie trasowania helper link_to <%= link_to "książki", :controller => "books", :action => "index" %> <a href="/books">książki</a> <%= link_to "książki", books_path %> <a href="/books">książki</a> <%= link_to "nowa książka", new_book_path %> <a href="/books/new">nowa książka</a> <%= link_to @book.title, @book %> <a href="/books/1">mały Książę</a> <%= link_to @author.books.first.title, [@author, @author.books.first] %> <a href="/authors/2/books/1"/>mały Książę</a>

Użycie trasowania helper link_to <%= link_to "książki", :controller => "books", :action => "index" %> <a href="/books">książki</a> <%= link_to "książki", books_path %> <a href="/books">książki</a> <%= link_to "nowa książka", new_book_path %> <a href="/books/new">nowa książka</a> <%= link_to @book.title, @book %> <a href="/books/1">mały Książę</a> <%= link_to @author.books.first.title, [@author, @author.books.first] %> <a href="/authors/2/books/1"/>mały Książę</a> <%= link_to "start", root_url %> <a href="/"/>start</a>

Użycie trasowania helper link_to <%= link_to "książki", :controller => "books", :action => "index" %> <a href="/books">książki</a> <%= link_to "książki", books_path %> <a href="/books">książki</a> <%= link_to "nowa książka", new_book_path %> <a href="/books/new">nowa książka</a> <%= link_to @book.title, @book %> <a href="/books/1">mały Książę</a> <%= link_to @author.books.first.title, [@author, @author.books.first] %> <a href="/authors/2/books/1"/>mały Książę</a> <%= link_to "start", root_url %> <a href="/"/>start</a> <%= link_to "wyloguj", logout_path %> <a href="/logout"/>wyloguj</a>

Wyświetlenie dostępnych tras rake routes books GET /books(.:format) {:action=>"index", :controller=>"books"} books POST /books(.:format) {:action=>"create", :controller=>"books"} new_book GET /books/new(.:format) {:action=>"new", :controller=>"books"} edit_book GET /books/:id/edit(.:format) {:action=>"edit", :controller=>"books"} book GET /books/:id(.:format) {:action=>"show", :controller=>"books"} PUT /books/:id(.:format) {:action=>"update", :controller=>"books"} DELETE /books/:id(.:format) {:action=>"destroy", :controller=>"books"}

Kolekcja zasobów resources :books HTTP URL akcja przeznaczenie GET /books index lista książek GET /books/new new formularz nowej książki POST /books create utworzenie nowej książki GET /books/:id show wyświetlenie książki GET /books/:id/edit edit formularz edycji książki PUT /books/:id update zmodyfikowanie książki DELETE /books/:id destroy usunięcie książki

Kolekcja zasobów helper resources :books HTTP URL akcja helper GET /books index books_path GET /books/new new new_book_path POST /books create GET /books/:id show book_path(id) GET /books/:id/edit edit edit_book_path PUT /books/:id update DELETE /books/:id destroy

Pojedynczy zasób resource :user_session HTTP URL akcja przeznaczenie GET /user_session/new new formularz nowej sesji POST /user_session create utworzenie nowej sesji GET /user_session show wyświetlenie sesji GET /user_session/edit edit formularz edycji sesji PUT /user_session update zmodyfikowanie sesji DELETE /user_session destroy usunięcie sesji

Zagnieżdżone zasoby resources :authors do resources :books end HTTP URL akcja przeznaczenie GET /authors/:id/books index lista książek autora GET /authors/:id/books/new new formularz n. książki POST /authors/:id/books create utworzenie książki GET /authors/:id/books/:id show wyświetlenie książki GET /authors/:id/books/:id/edit edit formularz e. książki PUT /authors/:id/books/:id update zmodyf. książki DELETE /authors/:id/books/:id destroy usunięcie książki

Dodatkowe akcje resources :books do get 'abstract', :on => :member get 'recent', :on => :collection end

Dodatkowe akcje resources :books do get 'abstract', :on => :member get 'recent', :on => :collection end poza predefiniowanymi akcjami można dodawać własne

Dodatkowe akcje resources :books do get 'abstract', :on => :member get 'recent', :on => :collection end poza predefiniowanymi akcjami można dodawać własne należy zdefiniować czy akcja definiowana jest dla pojedynczego zasoby member grupy zasobów collection

Dodatkowe akcje resources :books do get 'abstract', :on => :member get 'recent', :on => :collection end poza predefiniowanymi akcjami można dodawać własne należy zdefiniować czy akcja definiowana jest dla pojedynczego zasoby member grupy zasobów collection jeśli tworzymy wiele akcji tego typu, należy zastanowić się czy nie powinniśmy dodać nowego zasobu (zagnieżdżonego)

Helpery # zasoby zwykłe link_to @book.title, book_path(@book) link_to @book.title, @book link_to @book.title, abstract_book_path(@book) link_to "Najnowsze książki", recent_books_path

Helpery # zasoby zwykłe link_to @book.title, book_path(@book) link_to @book.title, @book link_to @book.title, abstract_book_path(@book) link_to "Najnowsze książki", recent_books_path # zasoby zagnieżdżone link_to @author.books.first.title, author_book_path(@author,@author.books.first) link_to @author.books.first.title, [@author,@author.books.first]

Dodatkowe możliwości trasowania strona startowa root :to => "books#index"

Dodatkowe możliwości trasowania strona startowa root :to => "books#index" obsługa adresu spoza REST match 'contact' => 'posts#show', :name => 'contact'

Dodatkowe możliwości trasowania strona startowa root :to => "books#index" obsługa adresu spoza REST match 'contact' => 'posts#show', :name => 'contact' segmenty opcjonalne w adresie match ':controller(/:action(/:id))'

Dodatkowe możliwości trasowania strona startowa root :to => "books#index" obsługa adresu spoza REST match 'contact' => 'posts#show', :name => 'contact' segmenty opcjonalne w adresie match ':controller(/:action(/:id))' ograniczenia dla segmentów match 'posts/:name' => "posts#show", :constraints => {:name => /\w+/}

Dodatkowe możliwości trasowania strona startowa root :to => "books#index" obsługa adresu spoza REST match 'contact' => 'posts#show', :name => 'contact' segmenty opcjonalne w adresie match ':controller(/:action(/:id))' ograniczenia dla segmentów match 'posts/:name' => "posts#show", :constraints => {:name => /\w+/} ograniczenia dla akcji get 'posts/:name' => "posts#show"

Plan prezentacji Wprowadzenie Trasowanie Warstwa kontrolera Obsługa stanu

Generowanie kontrolera rails generate controller messages hello greeting create app/controllers/messages_controller.rb route get "messages/greeting" route get "messages/hello" invoke erb create app/views/messages create app/views/messages/hello.html.erb create app/views/messages/greeting.html.erb invoke test_unit create test/functional/messages_controller_test.rb invoke helper create app/helpers/messages_helper.rb...

Przykładowy kontroler app/controllers/messages_controller.rb class MessagesController < ApplicationController def hello @message = "Witaj!" end def greeting @message = "Witaj #{params[:name]}" render :action => "hello" end end

Przykładowy kontroler app/controllers/messages_controller.rb class MessagesController < ApplicationController def hello @message = "Witaj!" end def greeting @message = "Witaj #{params[:name]}" render :action => "hello" end end config/routes.rb Simple::Application.routes.draw do get "messages/hello" post "messages/greeting" end

Przykładowy kontroler app/controllers/messages_controller.rb class MessagesController < ApplicationController def hello @message = "Witaj!" end def greeting @message = "Witaj #{params[:name]}" render :action => "hello" end end config/routes.rb Simple::Application.routes.draw do get "messages/hello" post "messages/greeting" end app/views/messages/hello.html.erb <h1> Komunikat systemu </h1> <%= @message %>

Zasady działania kontrolera dziedziczy z klasy ApplicationController

Zasady działania kontrolera dziedziczy z klasy ApplicationController kontroler posiada nazwę oraz definiuje akcje

Zasady działania kontrolera dziedziczy z klasy ApplicationController kontroler posiada nazwę oraz definiuje akcje nazwa jest tożsama z nazwą klasy pisaną w notacji wielbłądziej i pozbawioną sufiksu Controller

Zasady działania kontrolera dziedziczy z klasy ApplicationController kontroler posiada nazwę oraz definiuje akcje nazwa jest tożsama z nazwą klasy pisaną w notacji wielbłądziej i pozbawioną sufiksu Controller akcje są tożsame z wszystkimi publicznymi metodami tej klasy

Zasady działania kontrolera dziedziczy z klasy ApplicationController kontroler posiada nazwę oraz definiuje akcje nazwa jest tożsama z nazwą klasy pisaną w notacji wielbłądziej i pozbawioną sufiksu Controller akcje są tożsame z wszystkimi publicznymi metodami tej klasy domyślnie każdej akcji odpowiada odrębny widok o tej samej nazwie co akcja

Zasady działania kontrolera dziedziczy z klasy ApplicationController kontroler posiada nazwę oraz definiuje akcje nazwa jest tożsama z nazwą klasy pisaną w notacji wielbłądziej i pozbawioną sufiksu Controller akcje są tożsame z wszystkimi publicznymi metodami tej klasy domyślnie każdej akcji odpowiada odrębny widok o tej samej nazwie co akcja widoki kontrolera znajdują się w katalogu app/views/nazwa_kontrolera

Zasady działania kontrolera dziedziczy z klasy ApplicationController kontroler posiada nazwę oraz definiuje akcje nazwa jest tożsama z nazwą klasy pisaną w notacji wielbłądziej i pozbawioną sufiksu Controller akcje są tożsame z wszystkimi publicznymi metodami tej klasy domyślnie każdej akcji odpowiada odrębny widok o tej samej nazwie co akcja widoki kontrolera znajdują się w katalogu app/views/nazwa_kontrolera app/views/messages widoki kontrolera MessagesController

Zasady działania kontrolera dziedziczy z klasy ApplicationController kontroler posiada nazwę oraz definiuje akcje nazwa jest tożsama z nazwą klasy pisaną w notacji wielbłądziej i pozbawioną sufiksu Controller akcje są tożsame z wszystkimi publicznymi metodami tej klasy domyślnie każdej akcji odpowiada odrębny widok o tej samej nazwie co akcja widoki kontrolera znajdują się w katalogu app/views/nazwa_kontrolera app/views/messages widoki kontrolera MessagesController app/views/messages/hello.html.erb widok odpowiadający akcji hello

Przekazywanie danych do widoku dane pomiędzy kontrolerem a widokiem przekazywane są za pośrednictwem zmiennych instancyjnych

Przekazywanie danych do widoku dane pomiędzy kontrolerem a widokiem przekazywane są za pośrednictwem zmiennych instancyjnych akcja hello def hello @message = "Witaj!" end

Przekazywanie danych do widoku dane pomiędzy kontrolerem a widokiem przekazywane są za pośrednictwem zmiennych instancyjnych akcja hello def hello @message = "Witaj!" end widok hello <%= @message %>

Przekazywanie danych do widoku dane pomiędzy kontrolerem a widokiem przekazywane są za pośrednictwem zmiennych instancyjnych akcja hello def hello @message = "Witaj!" end widok hello <%= @message %> akcja może wykorzystać inny widok niż domyślnie przypisany, o ile zainicjuje odpowiednie zmienne instancyjne

Przekazywanie danych do widoku dane pomiędzy kontrolerem a widokiem przekazywane są za pośrednictwem zmiennych instancyjnych akcja hello def hello @message = "Witaj!" end widok hello <%= @message %> akcja może wykorzystać inny widok niż domyślnie przypisany, o ile zainicjuje odpowiednie zmienne instancyjne akcja greeting def greeting @message = "Witaj #{params[:name]}" render :action => "hello" end

Przekazywanie danych do kontrolera dane pomiędzy widokiem a kontrolerem przekazywane są pośrednictwem parametrów żądania HTTP: GET oraz POST

Przekazywanie danych do kontrolera dane pomiędzy widokiem a kontrolerem przekazywane są pośrednictwem parametrów żądania HTTP: GET oraz POST formularz <% form_tag :controller => "messages", :action => "greeting" do %> <%= text_field_tag :name %> <% end %>

Przekazywanie danych do kontrolera dane pomiędzy widokiem a kontrolerem przekazywane są pośrednictwem parametrów żądania HTTP: GET oraz POST formularz <% form_tag :controller => "messages", :action => "greeting" do %> <%= text_field_tag :name %> <% end %> akcja greeting def greeting @message = "Witaj #{params[:name]}" render :action => "hello" end

Przekazywanie danych do kontrolera dane pomiędzy widokiem a kontrolerem przekazywane są pośrednictwem parametrów żądania HTTP: GET oraz POST formularz <% form_tag :controller => "messages", :action => "greeting" do %> <%= text_field_tag :name %> <% end %> akcja greeting def greeting @message = "Witaj #{params[:name]}" render :action => "hello" end niezależnie od źródłowej postaci (query string, POST body, XML, JSON), dane dostępne są za pomocą zmiennej params

Przekazywanie danych do kontrolera dane pomiędzy widokiem a kontrolerem przekazywane są pośrednictwem parametrów żądania HTTP: GET oraz POST formularz <% form_tag :controller => "messages", :action => "greeting" do %> <%= text_field_tag :name %> <% end %> akcja greeting def greeting @message = "Witaj #{params[:name]}" render :action => "hello" end niezależnie od źródłowej postaci (query string, POST body, XML, JSON), dane dostępne są za pomocą zmiennej params parametry są konwertowane do postaci tablicy asocjacyjnej

Przekazywanie danych do kontrolera dane pomiędzy widokiem a kontrolerem przekazywane są pośrednictwem parametrów żądania HTTP: GET oraz POST formularz <% form_tag :controller => "messages", :action => "greeting" do %> <%= text_field_tag :name %> <% end %> akcja greeting def greeting @message = "Witaj #{params[:name]}" render :action => "hello" end niezależnie od źródłowej postaci (query string, POST body, XML, JSON), dane dostępne są za pomocą zmiennej params parametry są konwertowane do postaci tablicy asocjacyjnej kluczami tej tablicy są symbole, np. :name

Weryfikacja poprawności danych Internet jest niebezpieczny... dla aplikacji webowych

Weryfikacja poprawności danych Internet jest niebezpieczny... dla aplikacji webowych Konieczne jest weryfikowanie danych przesyłanych przez użytkownika

Weryfikacja poprawności danych Internet jest niebezpieczny... dla aplikacji webowych Konieczne jest weryfikowanie danych przesyłanych przez użytkownika W Railsach rozwiazane jest to za pomocą mechanizmu Strong parameters

Weryfikacja poprawności danych Internet jest niebezpieczny... dla aplikacji webowych Konieczne jest weryfikowanie danych przesyłanych przez użytkownika W Railsach rozwiazane jest to za pomocą mechanizmu Strong parameters określane są akceptowane obiekty

Weryfikacja poprawności danych Internet jest niebezpieczny... dla aplikacji webowych Konieczne jest weryfikowanie danych przesyłanych przez użytkownika W Railsach rozwiazane jest to za pomocą mechanizmu Strong parameters określane są akceptowane obiekty dla każdego obiektu określane są akceptowane atrybuty

Weryfikacja poprawności danych Internet jest niebezpieczny... dla aplikacji webowych Konieczne jest weryfikowanie danych przesyłanych przez użytkownika W Railsach rozwiazane jest to za pomocą mechanizmu Strong parameters określane są akceptowane obiekty dla każdego obiektu określane są akceptowane atrybuty private def book_params params.require(:book).permit(:title,:author_id) end

Zmiana przepływu sterowania class MessagesController < ApplicationController def hello @message = "Witaj!" end def greeting if params[:name].empty? redirect_to :action => "hello" else @message = "Witaj #{params[:name]}" render :action => "hello" end end end

Renderowanie vs. przekierowanie renderowanie akcji:

Renderowanie vs. przekierowanie renderowanie akcji: przesłanie treści do użytkownika

Renderowanie vs. przekierowanie renderowanie akcji: przesłanie treści do użytkownika wszystkie zmienne instancyjne ustawione w pierwszej akcji są dostępne w widoku

Renderowanie vs. przekierowanie renderowanie akcji: przesłanie treści do użytkownika wszystkie zmienne instancyjne ustawione w pierwszej akcji są dostępne w widoku żadne dodatkowe zmienne instancyjne nie są ustawiane

Renderowanie vs. przekierowanie renderowanie akcji: przesłanie treści do użytkownika wszystkie zmienne instancyjne ustawione w pierwszej akcji są dostępne w widoku żadne dodatkowe zmienne instancyjne nie są ustawiane przekierowanie do akcji:

Renderowanie vs. przekierowanie renderowanie akcji: przesłanie treści do użytkownika wszystkie zmienne instancyjne ustawione w pierwszej akcji są dostępne w widoku żadne dodatkowe zmienne instancyjne nie są ustawiane przekierowanie do akcji: podmiana akcji

Renderowanie vs. przekierowanie renderowanie akcji: przesłanie treści do użytkownika wszystkie zmienne instancyjne ustawione w pierwszej akcji są dostępne w widoku żadne dodatkowe zmienne instancyjne nie są ustawiane przekierowanie do akcji: podmiana akcji wszystkie zmienne instancyjne oraz parametry żądania ustawione w pierwszej akcji są tracone po przekierowaniu

Renderowanie vs. przekierowanie renderowanie akcji: przesłanie treści do użytkownika wszystkie zmienne instancyjne ustawione w pierwszej akcji są dostępne w widoku żadne dodatkowe zmienne instancyjne nie są ustawiane przekierowanie do akcji: podmiana akcji wszystkie zmienne instancyjne oraz parametry żądania ustawione w pierwszej akcji są tracone po przekierowaniu tylko zmienne instancyjne ustawione w drugiej akcji są dostępne

Renderowanie vs. przekierowanie renderowanie akcji: przesłanie treści do użytkownika wszystkie zmienne instancyjne ustawione w pierwszej akcji są dostępne w widoku żadne dodatkowe zmienne instancyjne nie są ustawiane przekierowanie do akcji: podmiana akcji wszystkie zmienne instancyjne oraz parametry żądania ustawione w pierwszej akcji są tracone po przekierowaniu tylko zmienne instancyjne ustawione w drugiej akcji są dostępne zawartość obiektu flash nie ulega jednak zmianie

Filtrowanie akcji pozwala na deklaratywne wywołanie metod, które mają się wykonać przed, pod lub przed i po akcji głównej

Filtrowanie akcji pozwala na deklaratywne wywołanie metod, które mają się wykonać przed, pod lub przed i po akcji głównej mogą przerwać wykonywanie określonej akcji np. przekierowując do innej akcji

Filtrowanie akcji pozwala na deklaratywne wywołanie metod, które mają się wykonać przed, pod lub przed i po akcji głównej mogą przerwać wykonywanie określonej akcji np. przekierowując do innej akcji zastosowania:

Filtrowanie akcji pozwala na deklaratywne wywołanie metod, które mają się wykonać przed, pod lub przed i po akcji głównej mogą przerwać wykonywanie określonej akcji np. przekierowując do innej akcji zastosowania: wymuszenie uwierzytelniania

Filtrowanie akcji pozwala na deklaratywne wywołanie metod, które mają się wykonać przed, pod lub przed i po akcji głównej mogą przerwać wykonywanie określonej akcji np. przekierowując do innej akcji zastosowania: wymuszenie uwierzytelniania weryfikacji dostępu do określonych akcji

Filtrowanie akcji pozwala na deklaratywne wywołanie metod, które mają się wykonać przed, pod lub przed i po akcji głównej mogą przerwać wykonywanie określonej akcji np. przekierowując do innej akcji zastosowania: wymuszenie uwierzytelniania weryfikacji dostępu do określonych akcji kompresja danych wynikowych

Filtrowanie akcji pozwala na deklaratywne wywołanie metod, które mają się wykonać przed, pod lub przed i po akcji głównej mogą przerwać wykonywanie określonej akcji np. przekierowując do innej akcji zastosowania: wymuszenie uwierzytelniania weryfikacji dostępu do określonych akcji kompresja danych wynikowych określenie dodatkowych nagłówków

Filtrowanie akcji pozwala na deklaratywne wywołanie metod, które mają się wykonać przed, pod lub przed i po akcji głównej mogą przerwać wykonywanie określonej akcji np. przekierowując do innej akcji zastosowania: wymuszenie uwierzytelniania weryfikacji dostępu do określonych akcji kompresja danych wynikowych określenie dodatkowych nagłówków rodzaje filtrów:

Filtrowanie akcji pozwala na deklaratywne wywołanie metod, które mają się wykonać przed, pod lub przed i po akcji głównej mogą przerwać wykonywanie określonej akcji np. przekierowując do innej akcji zastosowania: wymuszenie uwierzytelniania weryfikacji dostępu do określonych akcji kompresja danych wynikowych określenie dodatkowych nagłówków rodzaje filtrów: before_filter filtr wykonywany przed akcją główną

Filtrowanie akcji pozwala na deklaratywne wywołanie metod, które mają się wykonać przed, pod lub przed i po akcji głównej mogą przerwać wykonywanie określonej akcji np. przekierowując do innej akcji zastosowania: wymuszenie uwierzytelniania weryfikacji dostępu do określonych akcji kompresja danych wynikowych określenie dodatkowych nagłówków rodzaje filtrów: before_filter filtr wykonywany przed akcją główną after_filter filtr wykonywany po akcji głównej

Filtrowanie akcji pozwala na deklaratywne wywołanie metod, które mają się wykonać przed, pod lub przed i po akcji głównej mogą przerwać wykonywanie określonej akcji np. przekierowując do innej akcji zastosowania: wymuszenie uwierzytelniania weryfikacji dostępu do określonych akcji kompresja danych wynikowych określenie dodatkowych nagłówków rodzaje filtrów: before_filter filtr wykonywany przed akcją główną after_filter filtr wykonywany po akcji głównej around_filter filtr okalający część wykonywana przed, a część po akcji głównej

Przykład filtrowania akcji class ApplicationController < ActionController::Base before_filter :require_login protected def require_login unless logged_in? flash[:error] = 'Trzeba być zalogowanym aby wykonać tę akcję!' redirect_to root_url end end def logged_in?!session[:user_id].nil? end end

Negocjacja treści Kontroler może użyć różnej reprezentacji danych (HTML, XML, JSON, itp.), w zależności od wystosowanego żądania app/controllers/books_controller.rb

Negocjacja treści Kontroler może użyć różnej reprezentacji danych (HTML, XML, JSON, itp.), w zależności od wystosowanego żądania app/controllers/books_controller.rb class BooksController < ApplicationController respod_to :html, :json # GET /books/1 # GET /books/1.xml def show @book = Book.find(params[:id]) respond_with @book end end

Negocjacja treści Kontroler może użyć różnej reprezentacji danych (HTML, XML, JSON, itp.), w zależności od wystosowanego żądania app/controllers/books_controller.rb class BooksController < ApplicationController respod_to :html, :json # GET /books/1 # GET /books/1.xml def show @book = Book.find(params[:id]) respond_with @book end end Dla każdego formatu używany jest domyślnie widok o nazwie: nazwa_akcji.nazwa_formatu.nazwa_renderera np. show.html.erb, show.xml.haml

Negocjacja treści przykład /books/1

Negocjacja treści przykład /books/1 <p> <b>title:</b> Alef </p> <p> <b>author:</b> Jorge Luis Borges </p>

Negocjacja treści przykład /books/1 <p> <b>title:</b> Alef </p> <p> <b>author:</b> Jorge Luis Borges </p> /books/1.xml lub /books/1 Accept:application/xml

Negocjacja treści przykład /books/1 <p> <b>title:</b> Alef </p> <p> <b>author:</b> Jorge Luis Borges </p> /books/1.xml lub /books/1 Accept:application/xml <?xml version="1.0" encoding="utf-8"?> <book> <author-id type="integer">1</author-id> <id type="integer">1</id> <title>alef</title> </book>

Plan prezentacji Wprowadzenie Trasowanie Warstwa kontrolera Obsługa stanu

Obsługa stanu protokół HTTP jest bezstanowy

Obsługa stanu protokół HTTP jest bezstanowy potrzebny jest dodatkowy mechanizm do obsługi stanu

Obsługa stanu protokół HTTP jest bezstanowy potrzebny jest dodatkowy mechanizm do obsługi stanu np. do przechowywania informacji o zalogowanym użytkowniku, zawartości jego koszyka, itp.

Obsługa stanu protokół HTTP jest bezstanowy potrzebny jest dodatkowy mechanizm do obsługi stanu np. do przechowywania informacji o zalogowanym użytkowniku, zawartości jego koszyka, itp. możliwe sposoby obsługi stanu

Obsługa stanu protokół HTTP jest bezstanowy potrzebny jest dodatkowy mechanizm do obsługi stanu np. do przechowywania informacji o zalogowanym użytkowniku, zawartości jego koszyka, itp. możliwe sposoby obsługi stanu zagnieżdżanie identyfikatora sesji w URL-u

Obsługa stanu protokół HTTP jest bezstanowy potrzebny jest dodatkowy mechanizm do obsługi stanu np. do przechowywania informacji o zalogowanym użytkowniku, zawartości jego koszyka, itp. możliwe sposoby obsługi stanu zagnieżdżanie identyfikatora sesji w URL-u zagnieżdżanie w niewidocznych polach formularza

Obsługa stanu protokół HTTP jest bezstanowy potrzebny jest dodatkowy mechanizm do obsługi stanu np. do przechowywania informacji o zalogowanym użytkowniku, zawartości jego koszyka, itp. możliwe sposoby obsługi stanu zagnieżdżanie identyfikatora sesji w URL-u zagnieżdżanie w niewidocznych polach formularza użycie ciasteczek (cookies)

Obsługa stanu protokół HTTP jest bezstanowy potrzebny jest dodatkowy mechanizm do obsługi stanu np. do przechowywania informacji o zalogowanym użytkowniku, zawartości jego koszyka, itp. możliwe sposoby obsługi stanu zagnieżdżanie identyfikatora sesji w URL-u zagnieżdżanie w niewidocznych polach formularza użycie ciasteczek (cookies) metody dostępne w kontrolerze do obsługi stanu:

Obsługa stanu protokół HTTP jest bezstanowy potrzebny jest dodatkowy mechanizm do obsługi stanu np. do przechowywania informacji o zalogowanym użytkowniku, zawartości jego koszyka, itp. możliwe sposoby obsługi stanu zagnieżdżanie identyfikatora sesji w URL-u zagnieżdżanie w niewidocznych polach formularza użycie ciasteczek (cookies) metody dostępne w kontrolerze do obsługi stanu: session

Obsługa stanu protokół HTTP jest bezstanowy potrzebny jest dodatkowy mechanizm do obsługi stanu np. do przechowywania informacji o zalogowanym użytkowniku, zawartości jego koszyka, itp. możliwe sposoby obsługi stanu zagnieżdżanie identyfikatora sesji w URL-u zagnieżdżanie w niewidocznych polach formularza użycie ciasteczek (cookies) metody dostępne w kontrolerze do obsługi stanu: session cookies

Obsługa stanu protokół HTTP jest bezstanowy potrzebny jest dodatkowy mechanizm do obsługi stanu np. do przechowywania informacji o zalogowanym użytkowniku, zawartości jego koszyka, itp. możliwe sposoby obsługi stanu zagnieżdżanie identyfikatora sesji w URL-u zagnieżdżanie w niewidocznych polach formularza użycie ciasteczek (cookies) metody dostępne w kontrolerze do obsługi stanu: session cookies flash

Obsługa stanu protokół HTTP jest bezstanowy potrzebny jest dodatkowy mechanizm do obsługi stanu np. do przechowywania informacji o zalogowanym użytkowniku, zawartości jego koszyka, itp. możliwe sposoby obsługi stanu zagnieżdżanie identyfikatora sesji w URL-u zagnieżdżanie w niewidocznych polach formularza użycie ciasteczek (cookies) metody dostępne w kontrolerze do obsługi stanu: session cookies flash powyższe metody posiadają strukturę tablicy asocjacyjnej

Sesja session def login user = User.authenticate(params[:login],params[:password]) session[:user_id] = user.id unless user.nil? end def find_user @user = User.find(session[:user_id]) end przechowuje dane pomiędzy kolejnymi żądaniami

Sesja session def login user = User.authenticate(params[:login],params[:password]) session[:user_id] = user.id unless user.nil? end def find_user @user = User.find(session[:user_id]) end przechowuje dane pomiędzy kolejnymi żądaniami może przechowywać obiekt dowolnego typu

Sesja session def login user = User.authenticate(params[:login],params[:password]) session[:user_id] = user.id unless user.nil? end def find_user @user = User.find(session[:user_id]) end przechowuje dane pomiędzy kolejnymi żądaniami może przechowywać obiekt dowolnego typu identyfikator sesji jest przechowywany w cookie i wysyłany przy każdym żądaniu

Sesja session def login user = User.authenticate(params[:login],params[:password]) session[:user_id] = user.id unless user.nil? end def find_user @user = User.find(session[:user_id]) end przechowuje dane pomiędzy kolejnymi żądaniami może przechowywać obiekt dowolnego typu identyfikator sesji jest przechowywany w cookie i wysyłany przy każdym żądaniu różnorodne opcje przechowywania danych sesji (plik, baza danych, cookie)

Sesja session def login user = User.authenticate(params[:login],params[:password]) session[:user_id] = user.id unless user.nil? end def find_user @user = User.find(session[:user_id]) end przechowuje dane pomiędzy kolejnymi żądaniami może przechowywać obiekt dowolnego typu identyfikator sesji jest przechowywany w cookie i wysyłany przy każdym żądaniu różnorodne opcje przechowywania danych sesji (plik, baza danych, cookie) domyślnie zaszyfrowane w cookie (nie trzeba usuwać umarłych sesji)

Ciasteczka cookies def remember_me cookies[:auth_token] = { :value => @session[:user].remember_token, :expires => @session[:user].remember_token_expires } end def find_user @user = User.find_by_remember_token(cookies[:auth_token]) end przechowywane w przeglądarce użytkownika

Ciasteczka cookies def remember_me cookies[:auth_token] = { :value => @session[:user].remember_token, :expires => @session[:user].remember_token_expires } end def find_user @user = User.find_by_remember_token(cookies[:auth_token]) end przechowywane w przeglądarce użytkownika przesyłane z każdym żądaniem

Ciasteczka cookies def remember_me cookies[:auth_token] = { :value => @session[:user].remember_token, :expires => @session[:user].remember_token_expires } end def find_user @user = User.find_by_remember_token(cookies[:auth_token]) end przechowywane w przeglądarce użytkownika przesyłane z każdym żądaniem mogą przechowywać wyłącznie łańcuchy znaków

Komunikaty jednorazowe flash flash[:notice] = 'Logowanie do systemu przebiegło pomyślnie' flash[:error] = 'Logowanie nie powiodło się!' pozwala na przekazywane tymczasowych obiektów pomiędzy akcjami

Komunikaty jednorazowe flash flash[:notice] = 'Logowanie do systemu przebiegło pomyślnie' flash[:error] = 'Logowanie nie powiodło się!' pozwala na przekazywane tymczasowych obiektów pomiędzy akcjami wszystko co zostanie umieszczone w flashu, zostanie udostępnione następnej akcji a później wyczyszczone

Komunikaty jednorazowe flash flash[:notice] = 'Logowanie do systemu przebiegło pomyślnie' flash[:error] = 'Logowanie nie powiodło się!' pozwala na przekazywane tymczasowych obiektów pomiędzy akcjami wszystko co zostanie umieszczone w flashu, zostanie udostępnione następnej akcji a później wyczyszczone najczęściej wykorzystywany do ustawiania komunikatów w akcjach, po których następuje przekierowanie do innej akcji

Przykład wykorzystania komunikatu Kontroler class PostsController < ApplicationController def create post = Post.new(params[:post]) if post.save flash[:notice] = "Post został utworzony" redirect_to :action => "show", :params => {:id => post.id} end end def show @post = Post.find(params[:id]) end end

Przykład wykorzystania komunikatu Kontroler class PostsController < ApplicationController def create post = Post.new(params[:post]) if post.save flash[:notice] = "Post został utworzony" redirect_to :action => "show", :params => {:id => post.id} end end def show @post = Post.find(params[:id]) end end Widok <% if flash[:notice] %> <div class="notice"><%= flash[:notice] %> </div> <% end %>

Materiały guides.rubyonrails.org/index.html podstawowe informacje o warstwie kontrolera guides.rubyonrails.org/routing.html trasowanie guides.rubyonrails.org/action_controller_overview.html warstwa kontrolera

Pytania PYTANIA?