Ruby On Rails Einführung

Preview:

DESCRIPTION

Introduction to the Ruby on Rails Web Framework (German)

Citation preview

Ruby on Rails

Rubyon

Railshttp://reinholdweber.com – reinhold.weber@gmx.net

Ruby on Rails

Inhalt

1.Einführende Beispiele2.Ruby3.Rails4.Live Beispiel

Ruby on Rails

RubyInterpretierte, objektorientierte &dynamisch typisierte Skriptsprache

RailsFullstack MVC WebApplication Framework

Ruby on Rails

„ Makes

Phplook like

Assembler “Ruby IRC Channel

Ruby on Rails

„ Nachahmung ist die höchste Form der

Anerkennung “

Ruby on Rails

Rails Nachbildungen in PHP

solar Seagull

Zend Framework

symfonyCakePHP

Prado

ZooP

WACT

CodeIgniter

Ruby on Rails

LibraryModul, das eine bestimmte Funktionalität anbietet

eZComponents / PEAR

Plattform, auf der man seine Anwendung aufbauen kann

Ruby on Rails / CakePHP / .NET / Django

Framework

Ruby on Rails

BasecampTwitter Mephisto

MeasuremapOdeo

Highrise43 Places

Backpackshopify

Rails Anwendungen

Ruby on Rails

Rubyeine dynamische, freie Programmiersprache,

die sich einfach anwenden und produktiv einsetzen lässt.

Sie hat eine elegante Syntax, die man leicht lesen und schreiben kann.

Ruby on Rails

Ruby- Japan 1995, Yukihiro Matsumoto

- Open Source

- Mischung aus Perl, Smalltalk, Eiffel, Ada und Lisp

- Hohe Qualität der Bibliotheken

- Wenige aber hochwertige Literatur

Ruby on Rails

Ruby

charakteristika

Ruby on Rails

Ruby- Generisch, interpretiert, reflektiert, mit Garbage Collector

- Eher auf Menschen als auf Computer optimiert

- Mächtiger als Perl, objektorientierter als Python

- Alles ist ein Objekt, keine primitiven Datentypen

- Starke dynamische Typisierung

Ruby on Rails

Alles ist ein Objekt

String = String.new

5.times do puts „Hello World“

end

Hello WorldHello WorldHello WorldHello WorldHello World=> 5

Ruby on Rails

Alles ist ein Objekt

1.upto(100) { |i| puts i }

3.141.ceil

2.718.floor

123…100=> 1

=> 4

=> 2

Ruby on Rails

Alles ist ein Objekt

rand.to_s [2..10]

validates_each :href, :on => :create do |record, attr, value| begin uri = URI.parse(value) if uri.class != URI::HTTP record.errors.add(attr, 'Only HTTP protocol addresses can be used') end rescue URI::InvalidURIError record.errors.add(attr, 'The format of the url is not valid.') end end

8digit longrandom number

Ruby on Rails

Alles ist ein Objekt

class Auto def beschleunigen puts 'Brumm' endend auto1 = Auto.newauto1.beschleunigen

Brumm=> nil

Ruby on Rails

Alles ist ein Objekt

class GutesAuto < Auto def bremsen puts 'Quietsch' endend auto2 = GutesAuto.newauto2.beschleunigenauto2.bremsen

BrummQuietsch=> nil

Ruby on Rails

Ruby Syntaxa = [1, 'hi', 3.14, 1, 2, [4, 5]] a[2] # 3.14a.reverse # [[4, 5], 2, 1, 3.14, 'hi', 1]a.flatten.uniq # [1, 'hi', 3.14, 2, 4, 5]

Ruby on Rails

PHP Ruby Gemeinsamkeiten

+ auch dynamisch typisiert

+ es gibt Klassen und Zugriffsmodifizierer(public, protected, private)

+ heredoc Syntax

- Exceptions wie in PHP 5

Ruby on Rails

PHP Ruby Gemeinsamkeiten

+ große Standardbibliothek

+ true und false wie in PHP, null = nil

+ einige Variablen beginnen mit $

+ String Interpolation „$foo is a $bar” --- ”#{foo} is a #{bar}”

Ruby on Rails

PHP Ruby Unterschiede

- hat strenge Typisierung to_s, to_i

- Strings, Zahlen, Arrays und Hashes sind Objekte Statt abs(-1) hier -1.abs- Klammern in Methodenaufrufen sind optional

- keine abstract oder interface Klassen

Ruby on Rails

Java Ruby Gemeinsamkeiten

+ Speicher wird von einem Garbage-Collector verwaltet + Werkzeuge zur Dokumentation: RDoc + Objekte sind stark getypt

+ es gibt Klassen und Zugriffsmodifizierer(public, protected, private)

Ruby on Rails

Java Ruby Unterschiede

- muss nicht kompiliert werden - verschiedene GUI Toolkits z.B. WxRuby - require statt import

- Klammern in Methodenaufrufen optionalget_books

Ruby on Rails

Java Ruby Unterschiede

- Alle Instanzvariablen sind privat, Zugriff nur über Methoden - Keine statische Typprüfung - keine Typdeklarationen notwendig

a = [1,2,3] statt int[] a = [1,2,3];

- keine Typumwandlung (Typecasting)

Ruby on Rails

Java Ruby Unterschiede

- Konstruktor heißt immer initialize anstatt Klassenname - Mixins anstelle von Interfaces - self anstatt this

- Unit-Testing noch einfacher

Ruby on Rails

Rails- Dänemark 2004, David Heinemeier Hansson

- Open Source MIT Lizenz

- 15 Core Entwickler

- Fullstack MVC WebFramework

- Wurde aus bestehender Anwendung extrahiert

Ruby on Rails

Ruby on Rails

philosophie

Ruby on Rails

Ruby on Rails

Die 1. Regel im Rails Club lautet:

Don‘t repeat yourself

Ruby on Rails

Ruby on Rails

Die 2. Regel im Rails Club lautet:

Don‘t repeat yourself

Ruby on Rails

DRY"Don't repeat yourself"-Prinzip (DRY):

Bsp: In Rails ist kein explizites Datenbankschema nötig, um mit der Datenbank zu kommunizieren, da die Datenbank direkt ausgewertet wird.

Ruby on Rails

MVC

Best practicesREST

Conventionover configuration

DRY OOPActive Record

CRUD

Ruby on Rails

MVCRails verwendet das Modell-View-Controller-Muster (MVC), welches die Schichten der Anwendung sauber in Verantwortungsbereiche aufteilt

Ruby on Rails

MVCDas Model bildet die zugrundeliegende Datenstruktur

Die View ist die Darstellung der Datenstruktur

Der Controller enthält die eigentliche Programmlogik

Ruby on Rails

MVC

Model

ControllerBrowser

View

Database

Ruby on Rails

MVC - ModelDas Model bildet die zugrundeliegende Datenstruktur

Die View ist die Darstellung der Datenstruktur

Der Controller enthält die eigentliche Programmlogik

Ruby on Rails

Active Record-ein Object-Relational Mapper (ORM)

Klasse Datenbanktabelle

Methoden Datenbankfelder

Objekt Datensatz

Ruby on Rails

Active RecordPatient

+name+email+date_of_birth+age+gender

Datenbank

Ruby on Rails

Active Record::Base#Findclass Patient< ActiveRecord::Baseend Patient.find(1)SELECT * FROM patients WHERE id = 1

Patient.countSELECT COUNT(*) AS count

Patient.find_by_name ‘Reinhold Weber‘SELECT * FROM patients WHERE name = ‚Reinhold Weber‘

Patient.find_by_date_of_birth ‘1985-07-08‘SELECT * FROM patients WHERE date_of_birth = ‚1985-07-08‘

Ruby on Rails

Modelsclass Patient< ActiveRecord::Baseend

class Encounter< ActiveRecord::Baseend

class Physician< ActiveRecord::Baseend

Ruby on Rails

Associationsclass Patient< ActiveRecord::Base has_many :encounters has_many :physicians, :through => :encounters end

class Encounter< ActiveRecord::Base belongs_to :patient belongs_to :physicianend

class Physician< ActiveRecord::Base has_many :encounters has_many :patients, :through => :encounters end

Ruby on Rails

Sensible Defaultsclass Patient < ActiveRecord::Base has_many :encounters, :class_name => 'Encounter', :foreign_key => 'patient_id' has_many :physicians, :through => encounters, :class_name => 'Physician', :foreign_key => 'physician_id'end

Ruby on Rails

Sensible Defaultsclass Encounter < ActiveRecord::Base belongs_to :patient, :class_name => 'Patient', :foreign_key => 'patient_id' belongs_to :physician, :class_name => 'Physician', :foreign_key => 'physician_id'end

Ruby on Rails

Sensible Defaultsclass Physician < ActiveRecord::Base has_many :encounters, :class_name => 'Encounter', :foreign_key => 'patient_id' has_many :patients, :through :encounters :class_name => 'Patient', :foreign_key => 'patient_id'end

Ruby on Rails

MVC - ViewDas Model bildet die zugrundeliegende Datenstruktur

Die View ist die Darstellung der Datenstruktur

Der Controller enthält die eigentliche Programmlogik

Ruby on Rails

View-Modul aus der ActionPack Bibliothek welches eine Antwort für den Client rendert

-entscheidet, welches Template und/oder Partial und Layout benutzt wird

-Templates benutzen helper Methoden um Links, Formulare und JavaScript zu generieren und Text zu formatiieren

Ruby on Rails

Templates-Vorlagen befinden sich in app/view/controller_name, .

-Z.B. die Vorlagen für start::PatientController befinden sich unter app/views/start/patient

- Vorlagen, die von mehreren Controllern benutzt werden befinden sich in app/views/shared

Ruby on Rails

Templates- rhtml - die am häufigsten vorkommende Variante für HTML. HTML Dateien mit eingebettetem Ruby, die die ERb Bibliothek benutzen

-rxml - Dateien mit Ruby code, die die Builder Bibliothek benutzen um XML zu generieren, wird normalerweise für RSS/Atom benutzt

- rjs - Ruby Code mit einer Rails spezifischen API, die JavaScript generiert. Wird benutzt für AJAX

Ruby on Rails

Partials- Partials sind Templates, die nur einen Teil einer Seite generieren wie z.B. einen Header oder Footer

-Partials helfen dabei Seitenelemente wiederzuverwenden

- funktionieren genauso wie Page Templates (views), laufen in derselben Umgebung und sind im selben Verzeichnis

-Dateinamen beginnen mit einem underscore _header

Ruby on Rails

Helpers- Helpers sind Ruby Module mit Methoden, die in den Templates verfügbar sind

-Helpers können Duplikate verhindern und minimieren den Code in den Templates

- Jeder Controller hat per default einen korrespondierenden helper unter app/helpers/controller_name_helper.rb

Ruby on Rails

View<html> <head> <title><%= @title %></title> </head> <body> <h1><%= @homepage_title %></h1>

<strong>Patient:</strong> <li>Name: <%= @patient.name %></li><%= render :partial => 'patient_details' %>

</body></html>

Ruby on Rails

MVC - ControllerDas Model bildet die zugrundeliegende Datenstruktur

Die View ist die Darstellung der Datenstruktur

Der Controller enthält die eigentliche Programmlogik

Ruby on Rails

Action Controller- Trennung von Business Logik & Präsentation

-Idealerweise sollte keinerlei Logik in der Präsentationsschicht sein

-Controller sind Ruby Klassen und befinden sich in app/controllers

Ruby on Rails

Action Controllerclass PatientController < ApplicationController def index @patient = Patient.find :first

@title = 'Patient Detail'@homepage_title = "Patient: #{@patient.name}"

endend

Ruby on Rails

Intelligente Architektur

Jede Rails-Anwendung hat eine identische Dateistruktur, es sind kaum Konfigurationsanpassungen nötig.

Ruby on Rails

Strukturapp/components/config/db/doc/lib/log/public/script/test/tmp/vendor/

ruby projekt1

Ruby on Rails

ScaffoldingMit wenigen Befehlen kann eine komplette Administrationsoberfläche zum Erstellen, Bearbeiten und Löschen von Datenbankeinträgen erstellt werden.

Rails erzeugt automatisch den Programm- und HTML-Code, der sukzessive um individuelle Funktionalität erweitert werden kann.

Ruby on Rails

Scaffolding

Klasse Datenbanktabelle

Methoden Datenbankfelder

Objekt Datensatz

Ruby on Rails

Konvention über Konfiguration

DB Tabelle ‚entries‘ Klasse ‚Entry‘

Ruby on Rails

MigrationsEin Weg das Datenbankschema zu entwickeln

Migrations benutzen eine datenbankunabhängige Ruby API

Migration Klassen erben von ActiveRecord::Migration

script/generate migration

Ruby on Rails

CRUDCreate: create, new

Read: find, find_by_<attr>

Update: save, update_attributes

Delete: destroy

Ruby on Rails

Schnelles Feedback

Ruby-Code wird zur Laufzeit interpretiert, Live-Änderungen an der Datenbankstruktur sind während der Entwicklung ohne Server-Neustart möglich.

Ruby on Rails

Web 2.0inklusive

Techniken wie AJAX und visuelle Effekte sind von Haus aus mit wenigen Zeilen nutzbar..

Ajax

Eye Candy

Ruby on Rails

Ruby on Rails

installation

Ruby on Rails

InstallationInstant Rails/ Locomotive Windows

MacPorts/ Quellen Mac

Quellen Linux

Ruby on Rails

Installation Ruby-rubyonrails.org/down

-Windows Installer runterladen, welcher Ruby und einige Extensions enthält

- Alle Komponenten installieren

Ruby on Rails

Installation Rails-Installierte Ruby Version ausgeben ruby -v

-Über RubyGem, das Paketverwaltungssystem von Ruby, Rails installieren gem install rails --include-dependencies

Ruby on Rails

Projekt anlegen-Neues Projekt erzeugen ruby> rails cookbook

-Server (WEBrick) starten ruby\cookbook> ruby script/server http://localhost:3000/

Ruby on Rails

Projekt konfigurieren-Datenbank Konfiguration cookbook/config/database.yml

-Server (WEBrick) neustarten ruby script/server http://localhost:3000/

Ruby on Rails

Projekt konfigurieren-Datenbank anlegen DB: cookbook Tb: recipes

-Model generieren ruby\cookbook> ruby script/generate model Recipe

Ruby on Rails

Projekt konfigurieren-Datenbank anlegen DB: cookbook Tb: recipes

- Conroller generieren ruby\cookbook> ruby script/generate controller Recipe

Ruby on Rails

RoR Editoren

SciTE3rdRail

Aptana

jEdit Eclipse

vim

emacsRadRails

Ruby on Rails

ROR Vorteile+ Sehr schnelle Ergebnisse v.a bei CRUD Applikationen

+ nimmt Entwicklern Routinearbeiten ab

+ Automatische Verwendung von Best Practices

Ruby on Rails

ROR Vorteile+ Organisierte Struktur der Anwendung

+ Viel Unterstützung durch freiwillige Supporter und Programmierer

+ Code läuft auf verschiedenen Plattformen mit minimalen Anpassungen

Ruby on Rails

ROR Vorteile+ 10-mal schnellere Ergebnisse als vergleichbare Java Framworks

+ Source-Code bleibt schlank – ca. 50% kleiner als ein vergleichbares PHP-Programm

+ Wartung der Software wird durch MVC, DRY, OOP viel einfacher, speziell bei großen Projekten

Ruby on Rails

ROR Vorteile+ Integriertes Test-Framework unterstützt automatisiertes Testen der Applikation. Dadurch können Fehlfunktionen von Anfang an minimiert werden

+ Web-Sicherheit ist integraler Bestandteil von Ruby on Rails

+ Web-2.0 (Ajax) fähig

Ruby on Rails

ROR Nachteile- Völlige Abhängigkeit vom Framework

- Je spezieller die Applikation, je weniger Vorteile

- Teilweise erheblicher Erstaufwand

- (noch) nicht sehr weit verbreitet (Hosting)

Ruby on Rails

ROR Nachteile- Deployment ist kompliziert

- Größtes Problem: Performance & Skalierbarkeit

- Teilweise erheblicher Erstaufwand

- (noch) nicht sehr weit verbreitet (Hosting)

Ruby on Rails

Lernen von Rails-Entwickeln nach Code Standards und Best Practices Convention over Configuration

- MVC, DRY Ansatz für Webanwendungen

- Test Driven Development

- Einsatz von OOP

Ruby on Rails

Ruby on Rails

ressourcen

Ruby on Rails

WWW- rubyonrails.com/

- wiki.rubyonrails.org/rails

- api.rubyonrails.org/

- (noch) nicht sehr weit verbreitet (Hosting)

Ruby on Rails

Bücher

-Agile Web Development with Rails – DHH

- Rails Recipes – Chad Fowler

- why's (poignant) guide to Ruby - http://poignantguide.net/ruby/

Ruby on Rails

Q & A