SlideShare ist ein Scribd-Unternehmen logo
.NET
User
Group
Bern
Johnny Graber
http://www.JGraber.ch
JG@JGraber.ch
Follow dnugbe on twitter
http://www.dnug-bern.ch/rss.aspx
DNUG Bern Regionalsponsoren
DNUG Bern Sachsponsoren
Heutiges Twitter-Hashtag
#dnugberuby
Über Johnny Graber
• Applikationsentwicker @ FMH, Bern
– Ärztliche Weiter- und Fortbildungsplattform
• Web: http://www.JGraber.ch
• Twitter: @j_graber
Hinweis: Verwendung für eigene Präsentationen nur mit Einverständis des Autors
Agenda
• Ruby
• Rails
• Rails im Alltag
• Testing
• Weiterführende Informationen
Warnung
• Ich bin kein Experte.
• Diese Präsentation ist ein
Einstieg in Ruby und Rails
und enthält zahlreiche
Vereinfachungen.
Ruby
Wieso Ruby bei der DNUG Bern?
• Das grosse Gruseln zu Halloween?
http://www.flickr.com/photos/pedroferrer/3615212504/
Wieso Ruby bei der DNUG Bern?
• Vieles das die Arbeit in .Net erleichtert
geht auf Ruby/Rails zurück:
ASP.Net MVC EF Code First Migrations
NuGet Subsonic
Mspec SpecFlow
OWIN …
• Ruby & Rails inspirieren viele Entwickler
• Es macht Spass!
Ruby?
• Von Yukihiro „Matz“ Matsumoto
• seit 1993 entwickelt
• Objektorientierte Sprache
• Dynamische Typisierung
• Interpretiert
• Standardisiert als ISO/IEC 30170:2012
Wichtige Versionen
• 0.95: 1. veröffentlichte Version (12/1995)
• 1.8: älteste unterstützte Version (8/2003)
• 1.9: aktuelle Version (Dezember 2007)
• 2.0: nächste Version (Anfangs 2013)
Was kann man mit Ruby machen?
• Tätigkeiten automatisieren
• Daten konvertieren
• Simulationen berechnen
• Reports erzeugen
• Webanwendungen erstellen
• ...
Wichtige Unterschiede
• Keine grosse Firma im Hintergrund
• Alles ist ein Objekt
• Wird nicht kompiliert
• Inhalt bestimmt den Typ einer Variable
• Es gibt keine Interfaces
Basistypen
• Zahlen
– Fixnum a = 123
– Bignum b = 123_456_789_123_456_789_123
– Float c = 1.23
• Strings d = "Ruby & Rails"
Basistypen
• Ranges e = [5..10]
• Arrays f = [1, 2, 3]
• Hashes g = {"a"=> 1, "b"=> 2}
• Reguläre Ausdrücke h = /e?/
Symbols
• Dienen als Bezeichner
• „Vergleichbar“ mit Enum
• Über ganzes Programm hinweg eindeutig
:ruby
val = {a: "1", b: "2"}
Reservierte Schlüsselwörter
begin and alias END BEGIN
__LINE__ __FILE__ __ENCODING__
end elsif else do defined? def class case
break not nil next module in if for false
ensure true then super self return retry
rescue redo or yield while when until unless
undef
Klassen
• Ruby unterstützt Einfachvererbung
• Methode initialize() ist der Konstruktor
• Sichtbarkeit
– public: Sichtbar für alle
– protected: Sichtbar in Vererbungshierarchie
– private: Sichtbar nur für deklarierende Klasse
Beispiel Klasse
class Book < Item
attr_accessor :description
attr_reader :title
def initialize
@title= "Ruby"
@description= "A simple object"
end
private
def calcualte (value)
1 + 3 + value
end
end
Module
• Module sind Methodensammlungen
• Keine abstrakten Klassen in Ruby
• Mix-In: verwenden eines Moduls in einer
Klasse
• Ermöglichen "Mehrfachvererbung"
Beispiel Modul
module BooksHelper
def show_cover (book, size)
if(book.cover?)
image_tag book.cover.url(size)
else
path_to_placeholder
end
end
end
class Helper
extend BooksHelper
include Enumerable
end
Methoden
In Ruby gibt es keine Methodenaufrufe
Man sendet Meldungen an Objekte
• Jede Methode hat einen Rückgabewert
– Implizit: letzter Befehl
• Können an eine spezifische Objekt-
Instanz gehängt werde
• Konvention: <Methode>! verändert Objekt
Beispiel Methoden an Instanz
a = Object.new
b = Object.new
def a.hello
"Hello world"
end
a.hello
=> "Hello world"
b.hello
NoMethodError: undefined method `hello' for #<...>
method_missing
• Wird aufgerufen falls Methode fehlt
• Erlaubt eine dynamische Auswertung der
geschickten Meldung
• Ermöglicht Vorlagen für Antworten auf
erst zur Laufzeit bekannte Kriterien
– find_by_***** in ActiveRecord
Beispiel method_missing
class Demo
def method_missing(m, *args, &block)
puts "There is no method '#{m}' with this args: #{args}"
end
end
Demo.new.anything 1, 5, "Hello”
There is no method 'anything' with this args: [1, 5, "Hello"]
=> nil
Blöcke
• Sind Closures
– Zugriff auf die durch Iterator übergebenen
lokalen Variablen
• Syntaktisch Gleichwertig
– do |x| … end
– {|x| … }
• Beispiel: 5.times { puts ‘Hello’}
Kontrollstrukturen & Schleifen
• Kontrollstrukturen
– If / Elsif / Else
– Unless
– Case-when
• Schleifen
– While
– Until
– Loop
– For
– Each
Duck Typing
• Klassen sind keine Typen
• Das Verhalten eines Objekts bestimmt
seinen Typ:
If an object walks like a duck and talks like a
duck, then the interpreter is happy to treat it
as if it were a duck.
Monkey Patching
• Alles kann in Ruby verändert werden
• Änderungen an der Basisklassen
– Nennt man Monkey Patching
– Sollte man vorsichtig machen
– Ermöglicht Metaprogrammierung
Flexibilität von Ruby
• Alles kann verändert werden
• Method_missing lässt Objekte auf nicht
definierte Methoden antworten
• Duck Typing lässt beliebige Klassen
miteinander zusammenarbeiten
• Monkey Patching ermöglicht die
Weiterentwicklung ohne neuen Release
RubyGems
• Ist das Ruby Paketierungssystem
• Besteht aus
– Paketen (analog *.dll oder *.exe)
– Verwaltungstools
– Repository
• Dient zur Verteilung von Code
• Ist Vorbild für NuGet
IRB & Pry
• Interaktive Ruby Shell
• Zum Ausprobieren von Code
• Liefert sofortiges Feedback
• Hilft beim debuggen
Entwicklungsumgebung
• IDE wie Visual Studio werden kaum
verwendet
– RubyMine von JetBrains
• Meist eine Kombination von Texteditor
und IRB/Pry
– TextMate
– Sublime Text 2
– Vim / Emacs
Ruby Implementierungen
• MRI (Matz‘s Ruby Interpreter) [=> Ruby]
• JRuby (Java, läuft in der JVM)
• MacRuby (Objectiv-C, für Mac OS X)
• IronRuby (C#, DLR von .Net)
• Rubinius (Ruby, Ideen aus Smalltalk-80)
• RubyMotion (statisch komp. Code für iOS)
Wozu all die Implementierungen?
• Unterschiedliche Ziele
• Ruby ist zu langsam
– RMI schlecht für Multitasking (GIL)
• C Komponenten laufen nicht überall
• Bestehenden Code weiter verwenden
Unterstützte Betriebssysteme
• Ruby ist traditionell UNIX-Lastig
• Volle Unterstützung für Mac & Linux
• Windows holt auf
– Probleme: Nativer C-Code
– 25% der User von Engine Yard haben Windows
Rails
Ruby on Rails?
• Wird seit 2004 von David Heinemeier
Hansson (DHH) entwickelt
• Ist ein Web-Framework für Ruby
– Wurde aus Basecamp extrahiert
• Folgt den Prinzipien
– Don’t repeat yourself (DRY)
– Convention over configuration
Opinionated Framework
• Alles hat seinen Platz
• Der gewollte Weg ist der Kürzeste
– Alles bereit für TDD
– Klare Trennung zwischen Dev & Prod
• Abweichungen schmerzen
MVC – Model View Controller
Rails Demo: ToDo
Auftrag:
– Erstelle eine webbasierte ToDo-Verwaltung
– Implementiere CRUD für Items
– Speichere die Felder Title und Done
Rails Demo: ToDo – Befehle
rails new todo
cd todo
rails g scaffold item title:string done:boolean
rake db:create & rake db:migrate
rails s
Rails Demo: ToDo – Ergebnis
• Aufgabe erfüllt?
Und
• Alles geht auch mit JSON
• Umgebung für Prod & Test vorbereit
• Dokumentation generierbar
• Alles ganz ohne Code zu schreiben…
Demo: Kleinste Rails Anwendung
# Von http://thesmallestrailsapp.com/
%w(action_controller/railtie coderay markaby).map &method(:require)
run TheSmallestRailsApp ||= Class.new(Rails::Application) {
config.secret_token = routes.append {
root to: proc {
[200, {"Content-Type" => "text/html"}, [Markaby::Builder.new.html {
title @title = "The Smallest Rails App"
h3 "I am #@title!"
p "Here is my source code:"
text CodeRay.scan_file(__FILE__).div(line_numbers: :table)
p { a "Make me smaller", href: "//goo.gl/YdRpy" }
}]]
}
}.to_s
initialize!
}
Aufbau von Rails
• rails new liefert den ganze Rails-Stack
– Alles drin was man braucht
– Viel Ballast für kleine Anwendungen
• Rails besteht aus Modulen
• Module können weggelassen werden
• Module lassen sich austauschen
– Mongo_Mapper statt ActiveRecord
Rails Module
• Action Mailer (für E-Mail Versand)
• Action Pack (für View und Controller)
• Active Model (für Model)
• Active Record (der OR-Mapper)
• Active Resource (mapping REST zu Model)
• Active Support (Helper)
• Railties (Kern von Rails)
Active Record
• Ist ein Architektur-Pattern
• 2003 von Martin Fowler beschrieben
• Objekte
– Verfügen über CRUD-Methoden
– Objekte entsprechen DB-Tabellen
– Felder bilden DB-Spalten ab
• Bildet Basis für Datenzugriffe in Rails
– Kann wie jedes Modul ersetzt werden
Migrations
• DSL für Datenbank-Operationen
(Definitionen, nicht Abfragen)
• Migriert von einer Version zur nächsten
• Timestamp als eindeutige Version
• Verwaltet in Tabelle schema_migrations
Beispiel Migration (Rails)
class CreateBooks < ActiveRecord::Migration
def change
create_table :books do |t|
t.string :title
t.string :isbn
t.string :description
t.timestamps
end
end
end
Beispiel Migration (Rails)
class AddAttachmentToBooks < ActiveRecord::Migration
def self.up
change_table :books do |t|
t.has_attached_file :cover
end
end
def self.down
drop_attached_file :books, :cover
end
end
Beispiel Migration (C# für EF)
public partial class AddBlogUrl : DbMigration
{
public override void Up()
{
AddColumn("Blogs", "Url", c => c.String());
}
public override void Down()
{
DropColumn("Blogs", "Url");
}
}
# Migrations<timestamp>_AddBlogUrl.cs
Rack
• Ruby Webserver Interface
• Wrapper zwischen HTTP-Request und
HTTP-Response
• Verbindet Webserver - Webanwendungen
• Middleware
• Vorbild für OWIN
(Open Web Interface for .NET)
Bundler & Rake
• 2 wichtigste Werkzeuge für Rails
• Bundler
– Verwaltet Gems
– Führt Gemfile.lock
• Rake
– Build- und Automatisierungstool
– Tasks anzeigen: rake -T
Rails für grosse Anwendungen
• Initiale Struktur wird unübersichtlich
• Anwendung unterteilen
– Namespaces
– Gems
– Rails Engines
Ausblick Rails 4
• Erwartet auf Ende 2012
• ActiveSupport::Queue
• Unterstützt HTTP PATCH
• Async. Seitenaufbau mit Turbolinks
• Russian Doll Caching (cache_digests)
• ActionController::Live (streaming)
Alternativen zu Rails
• Sinatra
– DSL für die schnelle Entwicklung von
Webanwendungen in Ruby
– Web: http://www.sinatrarb.com
• Serve
– Rapid Prototyping Framework für
Webanwendungen, setzt auf Rack auf
– Web: http://get-serve.com
Rails im Alltag
Alltagstipps
• Auswahl der häufigsten Arbeiten
• Zum Aufzeigen der Arbeitsabläufe
• Neue Anwendung Buchverwaltung
– Book
– Author
Optik verbessern
• Rails unterstützt diverse CSS-Sprachen
– Sass / LESS / …
• Generiertes HTML ist minimal
• Kann selber beliebig verschönert werden
• Oder: (Twitter-) Bootstrap
Optik verbessern
• gem 'twitter-bootstrap-rails'
• rails g bootstrap:install
• rails g bootstrap:layout application fluid
• rails g bootstrap:themed books
(erst nach rake db:migrate für book)
n:m Relationen
• Daten sind miteinander Verknüpft
– Bücher haben mehrere Autoren
– Autoren schreiben mehrere Bücher
• Mapping über Hilfstabelle
• Zusätzliche Herausforderung
– Autoren mit Büchern erfassen
n:m Relationen
• Ressourcen erzeugen (Author, Book)
• rails g model authorship
author:references book:references
• authors/_form.erb.html übernehmen
• Massenzuweisung erlauben
• Nach Belieben mit JavaScript erweitern
Profiling aktivieren
• Rails nimmt einem viel Arbeit ab
• Was genau läuft im Hintergrund?
• MiniProfiler liefert Informationen
– Aus .Net nach Ruby portiert
Profiling aktivieren
• gem 'rack-mini-profiler'
• Starten
• Profiling in Produktion aktivieren
– BeforeFilter in ApplicationController
Paging
• Index-Action zeigt alle Resultate an
• Wird schnell zu einem Problem
• Paging verwenden
• Passende Gems:
– will_paginate
– kaminari
Paging
• gem 'will_paginate‘
• gem 'bootstrap-will_paginate'
• Paging im Controller aktivieren
• View um Paging-Control erweitern
Deployment durchführen
• Applikation soll veröffentlicht werden
• Viele Gems zur Unterstützung
– chef
– capistrano
• Oder in die Cloud?
– Heroku
Deployment durchführen
• Voraussetzungen für Heroku
– Account
– Applikation in Git verwaltet
– PostgreSQL als DB
– Heroku-Toolset installiert
Deployment durchführen
• /usr/local/heroku/bin/heroku create
• heroku addons:add heroku-postgresql
• git push heroku master
• heroku run rake --trace db:migrate
• heroku logs
Dateien anheften
• Dateien lassen sich an Objekte anheften
– Cover an Book
– Avatar an Author
• Paperclip kümmert sich um alles
– Benötigt imagemagick & gs
Dateien anheften
• gem 'paperclip'
• rails generate paperclip book cover
• rake db:migrate
• Book um Feld Cover ergänzen
• Helper für Bildanzeige erstellen
• Views anpassen
Verwaltungsfunktionen
• Nicht alle Daten sollen durch Benutzer
erfasst werden
• Oft genügt Model ohne View und
Controller
• ActiveAdmin liefert Komplettpaket
Verwaltungsfunktionen
• gem 'activeadmin'
• rails generate active_admin:install
• Migrationsdatei anpassen (User/PW)
• rake db:migrate
• rails generate active_admin:resource
book
• Bugfix in config/initializers/kaminari.rb
Testing
Testing in Ruby & Rails
• Testing ist tief in der Kultur verankert
– Kein Prüfung zur Kompilierzeit
– Hohe Wiederverwendung
– Best Practices will man leben
• Ruby und Rails unterstützen Testing
– Templates für Tests
– Duck Typing
Testing in Ruby & Rails
• Grosse Diskussionen
– Über Sinn und Unsinn von TDD
– Über Vor- und Nachteile von BDD
– Wirtschaftlichkeit
– Was sind die Best Practices?
– Sind Mocks gut oder böse?
• Tests müssen einem beim erreichen der
Projektziele unterstützen
Arten von Tests
• Akzeptanztest
• Systemtest
• Integrationstest
• Unittests
Detaillierung nimmt zu
Testdauer steigt
Test-Frameworks: RSpec
# bowling_spec.rb
require 'bowling'
describe Bowling, "#score" do
it "returns 0 for all gutter game" do
bowling = Bowling.new
20.times { bowling.hit(0) }
bowling.score.should eq(0)
end
end
$ rspec bowling_spec.rb --format nested
Bowling#score
returns 0 for all gutter game
Finished in 0.007534 seconds
1 example, 0 failures
Test-Frameworks: Cucumber
# language: de
Funktionalität: Division
Um dumme Fehler zu vermeiden
müssen Kassierer in der Lage sein einen Bruchteil zu berechnen
Szenario: Normale Zahlen
Gegeben sei ich habe 3 in den Taschenrechner eingegeben
Und ich habe 2 in den Taschenrechner eingegeben
Wenn ich divide drücke
Dann sollte das Ergebniss auf dem Bildschirm 1.5 sein
Angenommen /ich habe (d+) in den Taschenrechner eingegeben/ do |n|
@calc.push n.to_i
end
Wenn /ich (w+) drücke/ do |op|
@result = @calc.send op
end
Dann /sollte das Ergebniss auf dem Bildschirm (.*) sein/ do |result|
@result.should == result.to_f
end
Test-Tools
• Factory_girl
– Setzt Factory-Pattern um
– Erzeugt Objekte für Tests
• Guard / Autotest
– Continuous Testing
– Führen Tests im Hintergrund aus
• Simplecov
– Coverage Tool für Testabdeckung
Weiterführende
Informatonen
Podcasts
• Ruby 5 http://ruby5.envylabs.com/
• The Ruby Show http://rubyshow.com/
• Ruby Rogues http://rubyrogues.com/
Screencasts & Videos
• Railscasts http://railscasts.com/
• Confreaks http://www.confreaks.com/
• TekPub http://tekpub.com/
• PeepCode https://peepcode.com/
Buchempfehlungen
Leider veraltet
Webseiten
• Offizielle Seite zu Ruby:
http://www.ruby-lang.org
• Offizielle Seite zu Rails:
http://rubyonrails.org/
• RubyGems:
http://rubygems.org/
• Ruby Toolbox:
https://www.ruby-toolbox.com/
• TryRuby:
http://tryruby.org
Webseiten für Windows
• Ruby Installer:
http://rubyinstaller.org
• Rails Installer:
http://railsinstaller.org
• GitHub for Windows:
http://windows.github.com
Falls nur 1 Folie in Erinnerung
bleibt…
… Ruby ist eine dynamische OO-Sprache
… Rails ist ein mächtiges Webframework
… .Net profitiert von Ruby/Rails
… Es gibt mehr als nur einen richtigen Weg
… Eine Programmiersprache soll uns
Entwickler bei der Arbeit unterstützen
Fragen und Diskussion

Weitere ähnliche Inhalte

Ähnlich wie Ruby und Rails für .NET Entwickler

JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013
Oliver Zeigermann
 
Devops ohne root
Devops ohne rootDevops ohne root
Devops ohne root
cusy GmbH
 
Schau, Mutti, keine Programmierzeile
Schau, Mutti, keine ProgrammierzeileSchau, Mutti, keine Programmierzeile
Schau, Mutti, keine Programmierzeile
rokr
 
jRQL- Management Server Aufgaben elegant automatisieren
jRQL- Management Server Aufgaben elegant automatisieren jRQL- Management Server Aufgaben elegant automatisieren
jRQL- Management Server Aufgaben elegant automatisieren
msg systems ag
 
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
André Krämer
 
Javascript done right
Javascript done rightJavascript done right
Javascript done right
Dirk Ginader
 
Drupal Austria Roadshow in Klagenfurt
Drupal Austria Roadshow in KlagenfurtDrupal Austria Roadshow in Klagenfurt
Drupal Austria Roadshow in Klagenfurt
dasjo
 
Schweine latein-vortrag
Schweine latein-vortragSchweine latein-vortrag
Schweine latein-vortrag
Ramon Wartala
 
An Introduction to Ruby On Rails
An Introduction to Ruby On RailsAn Introduction to Ruby On Rails
An Introduction to Ruby On Rails
Jonathan Weiss
 
ColdFusion gibt's das noch?
ColdFusion gibt's das noch?ColdFusion gibt's das noch?
ColdFusion gibt's das noch?
Bokowsky + Laymann GmbH
 
Drupal, Context Modul
Drupal, Context ModulDrupal, Context Modul
Drupal, Context Modul
rokr
 
PHP mit Paul Bocuse
PHP mit Paul BocusePHP mit Paul Bocuse
PHP mit Paul Bocuse
Stephan Schmidt
 
Metaprogrammierung mit Ruby
Metaprogrammierung mit RubyMetaprogrammierung mit Ruby
Metaprogrammierung mit Ruby
Dario Rexin
 
Einführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureEinführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit Clojure
Sascha Koch
 
Blind Date mit Rails - Rails-Einführung
Blind Date mit Rails - Rails-EinführungBlind Date mit Rails - Rails-Einführung
Blind Date mit Rails - Rails-Einführung
Michael Whittaker
 
Drupal 7 - Domain-Access
Drupal 7 - Domain-AccessDrupal 7 - Domain-Access
Drupal 7 - Domain-Access
Steffen Rühlmann
 
20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatenge
20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatenge20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatenge
20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatenge
Karin Patenge
 
Migration vom ZF1 zum ZF2 von einfach bis fies (IPC Spring 2013, Berlin)
Migration vom ZF1 zum ZF2 von einfach bis fies (IPC Spring 2013, Berlin)Migration vom ZF1 zum ZF2 von einfach bis fies (IPC Spring 2013, Berlin)
Migration vom ZF1 zum ZF2 von einfach bis fies (IPC Spring 2013, Berlin)
Ralf Eggert
 
PostgreSQL: Die Freie Datenbankalternative
PostgreSQL: Die Freie DatenbankalternativePostgreSQL: Die Freie Datenbankalternative
PostgreSQL: Die Freie Datenbankalternative
Peter Eisentraut
 

Ähnlich wie Ruby und Rails für .NET Entwickler (20)

JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013
 
Devops ohne root
Devops ohne rootDevops ohne root
Devops ohne root
 
Schau, Mutti, keine Programmierzeile
Schau, Mutti, keine ProgrammierzeileSchau, Mutti, keine Programmierzeile
Schau, Mutti, keine Programmierzeile
 
jRQL- Management Server Aufgaben elegant automatisieren
jRQL- Management Server Aufgaben elegant automatisieren jRQL- Management Server Aufgaben elegant automatisieren
jRQL- Management Server Aufgaben elegant automatisieren
 
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
 
Javascript done right
Javascript done rightJavascript done right
Javascript done right
 
Drupal Austria Roadshow in Klagenfurt
Drupal Austria Roadshow in KlagenfurtDrupal Austria Roadshow in Klagenfurt
Drupal Austria Roadshow in Klagenfurt
 
Ruby on Rails
Ruby on RailsRuby on Rails
Ruby on Rails
 
Schweine latein-vortrag
Schweine latein-vortragSchweine latein-vortrag
Schweine latein-vortrag
 
An Introduction to Ruby On Rails
An Introduction to Ruby On RailsAn Introduction to Ruby On Rails
An Introduction to Ruby On Rails
 
ColdFusion gibt's das noch?
ColdFusion gibt's das noch?ColdFusion gibt's das noch?
ColdFusion gibt's das noch?
 
Drupal, Context Modul
Drupal, Context ModulDrupal, Context Modul
Drupal, Context Modul
 
PHP mit Paul Bocuse
PHP mit Paul BocusePHP mit Paul Bocuse
PHP mit Paul Bocuse
 
Metaprogrammierung mit Ruby
Metaprogrammierung mit RubyMetaprogrammierung mit Ruby
Metaprogrammierung mit Ruby
 
Einführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureEinführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit Clojure
 
Blind Date mit Rails - Rails-Einführung
Blind Date mit Rails - Rails-EinführungBlind Date mit Rails - Rails-Einführung
Blind Date mit Rails - Rails-Einführung
 
Drupal 7 - Domain-Access
Drupal 7 - Domain-AccessDrupal 7 - Domain-Access
Drupal 7 - Domain-Access
 
20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatenge
20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatenge20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatenge
20171121_DOAGKonferenz_JSON_OracleNoSQL_KPatenge
 
Migration vom ZF1 zum ZF2 von einfach bis fies (IPC Spring 2013, Berlin)
Migration vom ZF1 zum ZF2 von einfach bis fies (IPC Spring 2013, Berlin)Migration vom ZF1 zum ZF2 von einfach bis fies (IPC Spring 2013, Berlin)
Migration vom ZF1 zum ZF2 von einfach bis fies (IPC Spring 2013, Berlin)
 
PostgreSQL: Die Freie Datenbankalternative
PostgreSQL: Die Freie DatenbankalternativePostgreSQL: Die Freie Datenbankalternative
PostgreSQL: Die Freie Datenbankalternative
 

Mehr von NETUserGroupBern

Large Language Models, Data & APIs - Integrating Generative AI Power into you...
Large Language Models, Data & APIs - Integrating Generative AI Power into you...Large Language Models, Data & APIs - Integrating Generative AI Power into you...
Large Language Models, Data & APIs - Integrating Generative AI Power into you...
NETUserGroupBern
 
AAD und .NET
AAD und .NETAAD und .NET
AAD und .NET
NETUserGroupBern
 
SHIFT LEFT WITH DEVSECOPS
SHIFT LEFT WITH DEVSECOPSSHIFT LEFT WITH DEVSECOPS
SHIFT LEFT WITH DEVSECOPS
NETUserGroupBern
 
Securing .NET Core, ASP.NET Core applications
Securing .NET Core, ASP.NET Core applicationsSecuring .NET Core, ASP.NET Core applications
Securing .NET Core, ASP.NET Core applications
NETUserGroupBern
 
Application Security in ASP.NET Core
Application Security in ASP.NET CoreApplication Security in ASP.NET Core
Application Security in ASP.NET Core
NETUserGroupBern
 
Einführung in RavenDB
Einführung in RavenDBEinführung in RavenDB
Einführung in RavenDB
NETUserGroupBern
 
What Doctors Can Teach Us on Continuous Learning
What Doctors Can Teach Us on Continuous LearningWhat Doctors Can Teach Us on Continuous Learning
What Doctors Can Teach Us on Continuous Learning
NETUserGroupBern
 
Entity Framework Core - Der Umstieg auf Core
Entity Framework Core - Der Umstieg auf CoreEntity Framework Core - Der Umstieg auf Core
Entity Framework Core - Der Umstieg auf Core
NETUserGroupBern
 
Weiches Zeugs für harte Jungs und Mädels
Weiches Zeugs für harte Jungs und MädelsWeiches Zeugs für harte Jungs und Mädels
Weiches Zeugs für harte Jungs und Mädels
NETUserGroupBern
 
Änderungen im Cardinality Estimator SQL Server 2014
Änderungen im Cardinality Estimator SQL Server 2014Änderungen im Cardinality Estimator SQL Server 2014
Änderungen im Cardinality Estimator SQL Server 2014
NETUserGroupBern
 
Rest Fundamentals
Rest FundamentalsRest Fundamentals
Rest Fundamentals
NETUserGroupBern
 
Refactoring: Mythen & Fakten
Refactoring: Mythen & FaktenRefactoring: Mythen & Fakten
Refactoring: Mythen & Fakten
NETUserGroupBern
 
AngularJs
AngularJsAngularJs
AngularJs
NETUserGroupBern
 
Pragmatische Anforderungen
Pragmatische AnforderungenPragmatische Anforderungen
Pragmatische Anforderungen
NETUserGroupBern
 
Einführung in MongoDB
Einführung in MongoDBEinführung in MongoDB
Einführung in MongoDB
NETUserGroupBern
 
What the hell is PowerShell?
What the hell is PowerShell?What the hell is PowerShell?
What the hell is PowerShell?
NETUserGroupBern
 
Know your warm up
Know your warm upKnow your warm up
Know your warm up
NETUserGroupBern
 
BDD mit Machine.Specifications (MSpec)
BDD mit Machine.Specifications (MSpec)BDD mit Machine.Specifications (MSpec)
BDD mit Machine.Specifications (MSpec)
NETUserGroupBern
 
Versionskontrolle mit Git
Versionskontrolle mit GitVersionskontrolle mit Git
Versionskontrolle mit Git
NETUserGroupBern
 
.NETworking Workshop Design Thinking
.NETworking Workshop Design Thinking.NETworking Workshop Design Thinking
.NETworking Workshop Design Thinking
NETUserGroupBern
 

Mehr von NETUserGroupBern (20)

Large Language Models, Data & APIs - Integrating Generative AI Power into you...
Large Language Models, Data & APIs - Integrating Generative AI Power into you...Large Language Models, Data & APIs - Integrating Generative AI Power into you...
Large Language Models, Data & APIs - Integrating Generative AI Power into you...
 
AAD und .NET
AAD und .NETAAD und .NET
AAD und .NET
 
SHIFT LEFT WITH DEVSECOPS
SHIFT LEFT WITH DEVSECOPSSHIFT LEFT WITH DEVSECOPS
SHIFT LEFT WITH DEVSECOPS
 
Securing .NET Core, ASP.NET Core applications
Securing .NET Core, ASP.NET Core applicationsSecuring .NET Core, ASP.NET Core applications
Securing .NET Core, ASP.NET Core applications
 
Application Security in ASP.NET Core
Application Security in ASP.NET CoreApplication Security in ASP.NET Core
Application Security in ASP.NET Core
 
Einführung in RavenDB
Einführung in RavenDBEinführung in RavenDB
Einführung in RavenDB
 
What Doctors Can Teach Us on Continuous Learning
What Doctors Can Teach Us on Continuous LearningWhat Doctors Can Teach Us on Continuous Learning
What Doctors Can Teach Us on Continuous Learning
 
Entity Framework Core - Der Umstieg auf Core
Entity Framework Core - Der Umstieg auf CoreEntity Framework Core - Der Umstieg auf Core
Entity Framework Core - Der Umstieg auf Core
 
Weiches Zeugs für harte Jungs und Mädels
Weiches Zeugs für harte Jungs und MädelsWeiches Zeugs für harte Jungs und Mädels
Weiches Zeugs für harte Jungs und Mädels
 
Änderungen im Cardinality Estimator SQL Server 2014
Änderungen im Cardinality Estimator SQL Server 2014Änderungen im Cardinality Estimator SQL Server 2014
Änderungen im Cardinality Estimator SQL Server 2014
 
Rest Fundamentals
Rest FundamentalsRest Fundamentals
Rest Fundamentals
 
Refactoring: Mythen & Fakten
Refactoring: Mythen & FaktenRefactoring: Mythen & Fakten
Refactoring: Mythen & Fakten
 
AngularJs
AngularJsAngularJs
AngularJs
 
Pragmatische Anforderungen
Pragmatische AnforderungenPragmatische Anforderungen
Pragmatische Anforderungen
 
Einführung in MongoDB
Einführung in MongoDBEinführung in MongoDB
Einführung in MongoDB
 
What the hell is PowerShell?
What the hell is PowerShell?What the hell is PowerShell?
What the hell is PowerShell?
 
Know your warm up
Know your warm upKnow your warm up
Know your warm up
 
BDD mit Machine.Specifications (MSpec)
BDD mit Machine.Specifications (MSpec)BDD mit Machine.Specifications (MSpec)
BDD mit Machine.Specifications (MSpec)
 
Versionskontrolle mit Git
Versionskontrolle mit GitVersionskontrolle mit Git
Versionskontrolle mit Git
 
.NETworking Workshop Design Thinking
.NETworking Workshop Design Thinking.NETworking Workshop Design Thinking
.NETworking Workshop Design Thinking
 

Ruby und Rails für .NET Entwickler

  • 5. Über Johnny Graber • Applikationsentwicker @ FMH, Bern – Ärztliche Weiter- und Fortbildungsplattform • Web: http://www.JGraber.ch • Twitter: @j_graber Hinweis: Verwendung für eigene Präsentationen nur mit Einverständis des Autors
  • 6. Agenda • Ruby • Rails • Rails im Alltag • Testing • Weiterführende Informationen
  • 7. Warnung • Ich bin kein Experte. • Diese Präsentation ist ein Einstieg in Ruby und Rails und enthält zahlreiche Vereinfachungen.
  • 9. Wieso Ruby bei der DNUG Bern? • Das grosse Gruseln zu Halloween? http://www.flickr.com/photos/pedroferrer/3615212504/
  • 10. Wieso Ruby bei der DNUG Bern? • Vieles das die Arbeit in .Net erleichtert geht auf Ruby/Rails zurück: ASP.Net MVC EF Code First Migrations NuGet Subsonic Mspec SpecFlow OWIN … • Ruby & Rails inspirieren viele Entwickler • Es macht Spass!
  • 11. Ruby? • Von Yukihiro „Matz“ Matsumoto • seit 1993 entwickelt • Objektorientierte Sprache • Dynamische Typisierung • Interpretiert • Standardisiert als ISO/IEC 30170:2012
  • 12. Wichtige Versionen • 0.95: 1. veröffentlichte Version (12/1995) • 1.8: älteste unterstützte Version (8/2003) • 1.9: aktuelle Version (Dezember 2007) • 2.0: nächste Version (Anfangs 2013)
  • 13. Was kann man mit Ruby machen? • Tätigkeiten automatisieren • Daten konvertieren • Simulationen berechnen • Reports erzeugen • Webanwendungen erstellen • ...
  • 14. Wichtige Unterschiede • Keine grosse Firma im Hintergrund • Alles ist ein Objekt • Wird nicht kompiliert • Inhalt bestimmt den Typ einer Variable • Es gibt keine Interfaces
  • 15. Basistypen • Zahlen – Fixnum a = 123 – Bignum b = 123_456_789_123_456_789_123 – Float c = 1.23 • Strings d = "Ruby & Rails"
  • 16. Basistypen • Ranges e = [5..10] • Arrays f = [1, 2, 3] • Hashes g = {"a"=> 1, "b"=> 2} • Reguläre Ausdrücke h = /e?/
  • 17. Symbols • Dienen als Bezeichner • „Vergleichbar“ mit Enum • Über ganzes Programm hinweg eindeutig :ruby val = {a: "1", b: "2"}
  • 18. Reservierte Schlüsselwörter begin and alias END BEGIN __LINE__ __FILE__ __ENCODING__ end elsif else do defined? def class case break not nil next module in if for false ensure true then super self return retry rescue redo or yield while when until unless undef
  • 19. Klassen • Ruby unterstützt Einfachvererbung • Methode initialize() ist der Konstruktor • Sichtbarkeit – public: Sichtbar für alle – protected: Sichtbar in Vererbungshierarchie – private: Sichtbar nur für deklarierende Klasse
  • 20. Beispiel Klasse class Book < Item attr_accessor :description attr_reader :title def initialize @title= "Ruby" @description= "A simple object" end private def calcualte (value) 1 + 3 + value end end
  • 21. Module • Module sind Methodensammlungen • Keine abstrakten Klassen in Ruby • Mix-In: verwenden eines Moduls in einer Klasse • Ermöglichen "Mehrfachvererbung"
  • 22. Beispiel Modul module BooksHelper def show_cover (book, size) if(book.cover?) image_tag book.cover.url(size) else path_to_placeholder end end end class Helper extend BooksHelper include Enumerable end
  • 23. Methoden In Ruby gibt es keine Methodenaufrufe Man sendet Meldungen an Objekte • Jede Methode hat einen Rückgabewert – Implizit: letzter Befehl • Können an eine spezifische Objekt- Instanz gehängt werde • Konvention: <Methode>! verändert Objekt
  • 24. Beispiel Methoden an Instanz a = Object.new b = Object.new def a.hello "Hello world" end a.hello => "Hello world" b.hello NoMethodError: undefined method `hello' for #<...>
  • 25. method_missing • Wird aufgerufen falls Methode fehlt • Erlaubt eine dynamische Auswertung der geschickten Meldung • Ermöglicht Vorlagen für Antworten auf erst zur Laufzeit bekannte Kriterien – find_by_***** in ActiveRecord
  • 26. Beispiel method_missing class Demo def method_missing(m, *args, &block) puts "There is no method '#{m}' with this args: #{args}" end end Demo.new.anything 1, 5, "Hello” There is no method 'anything' with this args: [1, 5, "Hello"] => nil
  • 27. Blöcke • Sind Closures – Zugriff auf die durch Iterator übergebenen lokalen Variablen • Syntaktisch Gleichwertig – do |x| … end – {|x| … } • Beispiel: 5.times { puts ‘Hello’}
  • 28. Kontrollstrukturen & Schleifen • Kontrollstrukturen – If / Elsif / Else – Unless – Case-when • Schleifen – While – Until – Loop – For – Each
  • 29. Duck Typing • Klassen sind keine Typen • Das Verhalten eines Objekts bestimmt seinen Typ: If an object walks like a duck and talks like a duck, then the interpreter is happy to treat it as if it were a duck.
  • 30. Monkey Patching • Alles kann in Ruby verändert werden • Änderungen an der Basisklassen – Nennt man Monkey Patching – Sollte man vorsichtig machen – Ermöglicht Metaprogrammierung
  • 31. Flexibilität von Ruby • Alles kann verändert werden • Method_missing lässt Objekte auf nicht definierte Methoden antworten • Duck Typing lässt beliebige Klassen miteinander zusammenarbeiten • Monkey Patching ermöglicht die Weiterentwicklung ohne neuen Release
  • 32. RubyGems • Ist das Ruby Paketierungssystem • Besteht aus – Paketen (analog *.dll oder *.exe) – Verwaltungstools – Repository • Dient zur Verteilung von Code • Ist Vorbild für NuGet
  • 33. IRB & Pry • Interaktive Ruby Shell • Zum Ausprobieren von Code • Liefert sofortiges Feedback • Hilft beim debuggen
  • 34. Entwicklungsumgebung • IDE wie Visual Studio werden kaum verwendet – RubyMine von JetBrains • Meist eine Kombination von Texteditor und IRB/Pry – TextMate – Sublime Text 2 – Vim / Emacs
  • 35. Ruby Implementierungen • MRI (Matz‘s Ruby Interpreter) [=> Ruby] • JRuby (Java, läuft in der JVM) • MacRuby (Objectiv-C, für Mac OS X) • IronRuby (C#, DLR von .Net) • Rubinius (Ruby, Ideen aus Smalltalk-80) • RubyMotion (statisch komp. Code für iOS)
  • 36. Wozu all die Implementierungen? • Unterschiedliche Ziele • Ruby ist zu langsam – RMI schlecht für Multitasking (GIL) • C Komponenten laufen nicht überall • Bestehenden Code weiter verwenden
  • 37. Unterstützte Betriebssysteme • Ruby ist traditionell UNIX-Lastig • Volle Unterstützung für Mac & Linux • Windows holt auf – Probleme: Nativer C-Code – 25% der User von Engine Yard haben Windows
  • 38. Rails
  • 39. Ruby on Rails? • Wird seit 2004 von David Heinemeier Hansson (DHH) entwickelt • Ist ein Web-Framework für Ruby – Wurde aus Basecamp extrahiert • Folgt den Prinzipien – Don’t repeat yourself (DRY) – Convention over configuration
  • 40. Opinionated Framework • Alles hat seinen Platz • Der gewollte Weg ist der Kürzeste – Alles bereit für TDD – Klare Trennung zwischen Dev & Prod • Abweichungen schmerzen
  • 41. MVC – Model View Controller
  • 42. Rails Demo: ToDo Auftrag: – Erstelle eine webbasierte ToDo-Verwaltung – Implementiere CRUD für Items – Speichere die Felder Title und Done
  • 43. Rails Demo: ToDo – Befehle rails new todo cd todo rails g scaffold item title:string done:boolean rake db:create & rake db:migrate rails s
  • 44. Rails Demo: ToDo – Ergebnis • Aufgabe erfüllt? Und • Alles geht auch mit JSON • Umgebung für Prod & Test vorbereit • Dokumentation generierbar • Alles ganz ohne Code zu schreiben…
  • 45. Demo: Kleinste Rails Anwendung # Von http://thesmallestrailsapp.com/ %w(action_controller/railtie coderay markaby).map &method(:require) run TheSmallestRailsApp ||= Class.new(Rails::Application) { config.secret_token = routes.append { root to: proc { [200, {"Content-Type" => "text/html"}, [Markaby::Builder.new.html { title @title = "The Smallest Rails App" h3 "I am #@title!" p "Here is my source code:" text CodeRay.scan_file(__FILE__).div(line_numbers: :table) p { a "Make me smaller", href: "//goo.gl/YdRpy" } }]] } }.to_s initialize! }
  • 46. Aufbau von Rails • rails new liefert den ganze Rails-Stack – Alles drin was man braucht – Viel Ballast für kleine Anwendungen • Rails besteht aus Modulen • Module können weggelassen werden • Module lassen sich austauschen – Mongo_Mapper statt ActiveRecord
  • 47. Rails Module • Action Mailer (für E-Mail Versand) • Action Pack (für View und Controller) • Active Model (für Model) • Active Record (der OR-Mapper) • Active Resource (mapping REST zu Model) • Active Support (Helper) • Railties (Kern von Rails)
  • 48. Active Record • Ist ein Architektur-Pattern • 2003 von Martin Fowler beschrieben • Objekte – Verfügen über CRUD-Methoden – Objekte entsprechen DB-Tabellen – Felder bilden DB-Spalten ab • Bildet Basis für Datenzugriffe in Rails – Kann wie jedes Modul ersetzt werden
  • 49. Migrations • DSL für Datenbank-Operationen (Definitionen, nicht Abfragen) • Migriert von einer Version zur nächsten • Timestamp als eindeutige Version • Verwaltet in Tabelle schema_migrations
  • 50. Beispiel Migration (Rails) class CreateBooks < ActiveRecord::Migration def change create_table :books do |t| t.string :title t.string :isbn t.string :description t.timestamps end end end
  • 51. Beispiel Migration (Rails) class AddAttachmentToBooks < ActiveRecord::Migration def self.up change_table :books do |t| t.has_attached_file :cover end end def self.down drop_attached_file :books, :cover end end
  • 52. Beispiel Migration (C# für EF) public partial class AddBlogUrl : DbMigration { public override void Up() { AddColumn("Blogs", "Url", c => c.String()); } public override void Down() { DropColumn("Blogs", "Url"); } } # Migrations<timestamp>_AddBlogUrl.cs
  • 53. Rack • Ruby Webserver Interface • Wrapper zwischen HTTP-Request und HTTP-Response • Verbindet Webserver - Webanwendungen • Middleware • Vorbild für OWIN (Open Web Interface for .NET)
  • 54. Bundler & Rake • 2 wichtigste Werkzeuge für Rails • Bundler – Verwaltet Gems – Führt Gemfile.lock • Rake – Build- und Automatisierungstool – Tasks anzeigen: rake -T
  • 55. Rails für grosse Anwendungen • Initiale Struktur wird unübersichtlich • Anwendung unterteilen – Namespaces – Gems – Rails Engines
  • 56. Ausblick Rails 4 • Erwartet auf Ende 2012 • ActiveSupport::Queue • Unterstützt HTTP PATCH • Async. Seitenaufbau mit Turbolinks • Russian Doll Caching (cache_digests) • ActionController::Live (streaming)
  • 57. Alternativen zu Rails • Sinatra – DSL für die schnelle Entwicklung von Webanwendungen in Ruby – Web: http://www.sinatrarb.com • Serve – Rapid Prototyping Framework für Webanwendungen, setzt auf Rack auf – Web: http://get-serve.com
  • 59. Alltagstipps • Auswahl der häufigsten Arbeiten • Zum Aufzeigen der Arbeitsabläufe • Neue Anwendung Buchverwaltung – Book – Author
  • 60. Optik verbessern • Rails unterstützt diverse CSS-Sprachen – Sass / LESS / … • Generiertes HTML ist minimal • Kann selber beliebig verschönert werden • Oder: (Twitter-) Bootstrap
  • 61. Optik verbessern • gem 'twitter-bootstrap-rails' • rails g bootstrap:install • rails g bootstrap:layout application fluid • rails g bootstrap:themed books (erst nach rake db:migrate für book)
  • 62. n:m Relationen • Daten sind miteinander Verknüpft – Bücher haben mehrere Autoren – Autoren schreiben mehrere Bücher • Mapping über Hilfstabelle • Zusätzliche Herausforderung – Autoren mit Büchern erfassen
  • 63. n:m Relationen • Ressourcen erzeugen (Author, Book) • rails g model authorship author:references book:references • authors/_form.erb.html übernehmen • Massenzuweisung erlauben • Nach Belieben mit JavaScript erweitern
  • 64. Profiling aktivieren • Rails nimmt einem viel Arbeit ab • Was genau läuft im Hintergrund? • MiniProfiler liefert Informationen – Aus .Net nach Ruby portiert
  • 65. Profiling aktivieren • gem 'rack-mini-profiler' • Starten • Profiling in Produktion aktivieren – BeforeFilter in ApplicationController
  • 66. Paging • Index-Action zeigt alle Resultate an • Wird schnell zu einem Problem • Paging verwenden • Passende Gems: – will_paginate – kaminari
  • 67. Paging • gem 'will_paginate‘ • gem 'bootstrap-will_paginate' • Paging im Controller aktivieren • View um Paging-Control erweitern
  • 68. Deployment durchführen • Applikation soll veröffentlicht werden • Viele Gems zur Unterstützung – chef – capistrano • Oder in die Cloud? – Heroku
  • 69. Deployment durchführen • Voraussetzungen für Heroku – Account – Applikation in Git verwaltet – PostgreSQL als DB – Heroku-Toolset installiert
  • 70. Deployment durchführen • /usr/local/heroku/bin/heroku create • heroku addons:add heroku-postgresql • git push heroku master • heroku run rake --trace db:migrate • heroku logs
  • 71. Dateien anheften • Dateien lassen sich an Objekte anheften – Cover an Book – Avatar an Author • Paperclip kümmert sich um alles – Benötigt imagemagick & gs
  • 72. Dateien anheften • gem 'paperclip' • rails generate paperclip book cover • rake db:migrate • Book um Feld Cover ergänzen • Helper für Bildanzeige erstellen • Views anpassen
  • 73. Verwaltungsfunktionen • Nicht alle Daten sollen durch Benutzer erfasst werden • Oft genügt Model ohne View und Controller • ActiveAdmin liefert Komplettpaket
  • 74. Verwaltungsfunktionen • gem 'activeadmin' • rails generate active_admin:install • Migrationsdatei anpassen (User/PW) • rake db:migrate • rails generate active_admin:resource book • Bugfix in config/initializers/kaminari.rb
  • 76. Testing in Ruby & Rails • Testing ist tief in der Kultur verankert – Kein Prüfung zur Kompilierzeit – Hohe Wiederverwendung – Best Practices will man leben • Ruby und Rails unterstützen Testing – Templates für Tests – Duck Typing
  • 77. Testing in Ruby & Rails • Grosse Diskussionen – Über Sinn und Unsinn von TDD – Über Vor- und Nachteile von BDD – Wirtschaftlichkeit – Was sind die Best Practices? – Sind Mocks gut oder böse? • Tests müssen einem beim erreichen der Projektziele unterstützen
  • 78. Arten von Tests • Akzeptanztest • Systemtest • Integrationstest • Unittests Detaillierung nimmt zu Testdauer steigt
  • 79. Test-Frameworks: RSpec # bowling_spec.rb require 'bowling' describe Bowling, "#score" do it "returns 0 for all gutter game" do bowling = Bowling.new 20.times { bowling.hit(0) } bowling.score.should eq(0) end end $ rspec bowling_spec.rb --format nested Bowling#score returns 0 for all gutter game Finished in 0.007534 seconds 1 example, 0 failures
  • 80. Test-Frameworks: Cucumber # language: de Funktionalität: Division Um dumme Fehler zu vermeiden müssen Kassierer in der Lage sein einen Bruchteil zu berechnen Szenario: Normale Zahlen Gegeben sei ich habe 3 in den Taschenrechner eingegeben Und ich habe 2 in den Taschenrechner eingegeben Wenn ich divide drücke Dann sollte das Ergebniss auf dem Bildschirm 1.5 sein Angenommen /ich habe (d+) in den Taschenrechner eingegeben/ do |n| @calc.push n.to_i end Wenn /ich (w+) drücke/ do |op| @result = @calc.send op end Dann /sollte das Ergebniss auf dem Bildschirm (.*) sein/ do |result| @result.should == result.to_f end
  • 81. Test-Tools • Factory_girl – Setzt Factory-Pattern um – Erzeugt Objekte für Tests • Guard / Autotest – Continuous Testing – Führen Tests im Hintergrund aus • Simplecov – Coverage Tool für Testabdeckung
  • 83. Podcasts • Ruby 5 http://ruby5.envylabs.com/ • The Ruby Show http://rubyshow.com/ • Ruby Rogues http://rubyrogues.com/
  • 84. Screencasts & Videos • Railscasts http://railscasts.com/ • Confreaks http://www.confreaks.com/ • TekPub http://tekpub.com/ • PeepCode https://peepcode.com/
  • 87. Webseiten • Offizielle Seite zu Ruby: http://www.ruby-lang.org • Offizielle Seite zu Rails: http://rubyonrails.org/ • RubyGems: http://rubygems.org/ • Ruby Toolbox: https://www.ruby-toolbox.com/ • TryRuby: http://tryruby.org
  • 88. Webseiten für Windows • Ruby Installer: http://rubyinstaller.org • Rails Installer: http://railsinstaller.org • GitHub for Windows: http://windows.github.com
  • 89. Falls nur 1 Folie in Erinnerung bleibt… … Ruby ist eine dynamische OO-Sprache … Rails ist ein mächtiges Webframework … .Net profitiert von Ruby/Rails … Es gibt mehr als nur einen richtigen Weg … Eine Programmiersprache soll uns Entwickler bei der Arbeit unterstützen