63
Ruby on Rails Erweitern Ramon Wartala - Jan Krutisch 9. Juli 2007 - Lehmanns Fachbuchhandlung, Hamburg

Lehmanns Rails Erweitern

Embed Size (px)

DESCRIPTION

Slides of a presentation on Rails and extending Rails with Plugins and such, held at Lehmanns Fachbuchhandlung in Hamburg, at 2007-07-09

Citation preview

Page 1: Lehmanns Rails Erweitern

Ruby on RailsErweitern

Ramon Wartala - Jan Krutisch9. Juli 2007 - Lehmanns Fachbuchhandlung, Hamburg

Page 2: Lehmanns Rails Erweitern

Wer wir sind

• Jan Krutisch und Ramon Wartala

• Ehemalige Kollegen

• Gründer der deutschen Rails-UG

• Autoren von "Webanwendungen mit Ruby on Rails", Addison-Wesley

Page 3: Lehmanns Rails Erweitern

Wer wir sind

• Jan Krutisch und Ramon Wartala

• Ehemalige Kollegen

• Gründer der deutschen Rails-UG

• Autoren von "Webanwendungen mit Ruby on Rails", Addison-Wesley

Page 4: Lehmanns Rails Erweitern

• Dipl.-Inform.

• IT-Leiter bei Orangemedia GmbH

• Einer der führenden Online-Vermarkter

• Autor zahlreicher Artikel und Tagungsbeiträge rund um Softwareentwicklung

Ramon Wartala

Page 5: Lehmanns Rails Erweitern

Jan Krutisch

• Dipl.-Ing. (FH) Umwelttechnik

• Entwicklungsleiter für Rails-Projekte bei mindmatters (www.mindmatters.de)

• artdoxa.com / familylounge.de

• Jahrelange Erfahrung als Programmierer im Webbereich insbesondere in Java und PHP

Page 6: Lehmanns Rails Erweitern

• Juli 2004, David Heinemeier Hansson veröffentlicht Ruby on Rails als quelloffenes Framework für dir Erstellung von Web Applikationen mit Ruby

• Version 1.0 im Dezember 2005

• Version 1.2 im Januar 2007

Ruby on Rails Historie

Page 7: Lehmanns Rails Erweitern

Ruby on RailsGrundlagen

Page 8: Lehmanns Rails Erweitern

Ruby

Page 9: Lehmanns Rails Erweitern

• Moderne Skriptsprache

• Anleihen aus Perl, Python, Smalltalk, ...

• Alles ist ein Objekt: 5.days.from_now

• Starke Introspektion (aka Reflection)

• Schwache Typisierung

• Closures, Blocks, Iteratoren, etc.

Page 10: Lehmanns Rails Erweitern

def tausch(x,y)

[y, x]

end

x,y = tausch 1,2

=> x=2, y=1

Page 11: Lehmanns Rails Erweitern

def tausch(x,y)

[y, x]

end

x,y = tausch 1,2

=> x=2, y=1

Impliziter Rückgabewert

Page 12: Lehmanns Rails Erweitern

def tausch(x,y)

[y, x]

end

x,y = tausch 1,2

=> x=2, y=1

Impliziter Rückgabewert

Mehrfache Zuweisung

Page 13: Lehmanns Rails Erweitern

def tausch(x,y)

[y, x]

end

x,y = tausch 1,2

=> x=2, y=1

Impliziter Rückgabewert

Mehrfache Zuweisung

Wer braucht schon

Klammern

Page 14: Lehmanns Rails Erweitern

Rails

Page 15: Lehmanns Rails Erweitern

• ModelViewController-Architektur

• Convention over Configuration

• Don't Repeat Yourself

• Unterstützt die Testgetriebene Entwicklung

• Unterstützt agile Methoden

• Unterstützt Web2.0-Techniken (Ajax etc.)

Page 16: Lehmanns Rails Erweitern

• Sehr viel schnellere Entwicklung durch:

• Sehr viel weniger "Glue code"

• Konzentrierung auf Geschäftslogik

• Mehr Spaß am Entwickeln

• Höhere Produktivität

Das Versprechen von Rails

Page 17: Lehmanns Rails Erweitern

• Ruby ist nicht sehr performant

• Rails ist nicht sehr performant

• Kein „Allgemeinwissen“

• (Noch) keine "sichere Wahl" für Entscheider

Nachteile von Rails

Page 18: Lehmanns Rails Erweitern

• ActiveRecord: Objekt-relationaler Mapper

• ActionPack

• ActionView

• ActionController

• ActiveSupport

• ActionMailer

Die Komponenten

Page 19: Lehmanns Rails Erweitern

Code!

Page 20: Lehmanns Rails Erweitern

Model

class Book < ActiveRecord::Base

end

Page 21: Lehmanns Rails Erweitern

Model

Book.find :all

Book.find :first, :conditions =>

["isbn = ?", @isbn]

@book = Book.find_by_isbn(@isbn)

@book.title = "Ruby Cookbook"

@book.save

@book.destroy

Page 22: Lehmanns Rails Erweitern

Model mit Beziehungen

class Book < ActiveRecord::Base

belongs_to :library

end

class Library < ActiveRecord::Base

has_many :books

end

Page 23: Lehmanns Rails Erweitern

Model mit Beziehungen

@library = @book.library

@books = @library.books

@book = @library.books.find_by_isbn @isbn

@library << @book

@book.library = @library

Page 24: Lehmanns Rails Erweitern

Model mit Validierungen

class Book < ActiveRecord::Base

validates_presence_of :title

validates_uniqueness_of :isbn

end

Page 25: Lehmanns Rails Erweitern

Model mit Validierungen

@book = Book.new

@book.save # => false

@errors = @book.errors

Page 26: Lehmanns Rails Erweitern

Controller

class BooksController < ApplicationController

def index

@books = Book.find(:all)

end

end

Page 27: Lehmanns Rails Erweitern

View (HTML)

<ul>

<% for book in @books %>

<li><%=h book.title %></li>

<% end %>

</ul>

Page 28: Lehmanns Rails Erweitern

View (XML)xml.instruct! :xml, :version=>"1.0"

xml.bookfeed do

for book in @book

xml.book do

xml.title(book.title)

end

end

end

Page 29: Lehmanns Rails Erweitern

Weitere Features

Page 30: Lehmanns Rails Erweitern

Syntaktischer Zucker

• belongs_to :library

• has_many :books

• books_path

• book_path(@book)

Page 31: Lehmanns Rails Erweitern

Tests

• Basiert auf Test::Unit

• Unit-Tests (Auf Modellebene)

• Funktionale Tests (Auf Controllerebene)

• Integrationstests (Auf Applikationsebene)

• Testausführung automatisiert über Rake

Page 32: Lehmanns Rails Erweitern

Ajax etc.

• prototype.js

• script.aculo.us

• Helper

• rjs-Templates

Page 33: Lehmanns Rails Erweitern

Helper

• Textformatierung (Textile / Markdown)

excerpt(text, 'foo')

=> '...und foo ging...'

• Datums-Formatierungen

• Datums-Formular-Helper

• ...

Page 34: Lehmanns Rails Erweitern

RESTful

• URL = Resource

• GET / POST / PUT / DELETE

• Klare Architektur

• Viele kleine Controller mit wenig Actions

Page 35: Lehmanns Rails Erweitern

Rails erweitern

Page 36: Lehmanns Rails Erweitern

Rails erweitern

Durch:

• rake-Tasks

• Mixins

• Generatoren

• RubyGems

• Plugins

Page 37: Lehmanns Rails Erweitern

Plugins

• Erweitern der Rails-Basisklassen

• Metaprogrammierung!

• Überschreiben, Ergänzen (Mixins)

• Eigene Generatoren

• Eigene Rake-Tasks

Page 38: Lehmanns Rails Erweitern

Plugin-Skript

• ruby scripts/plugin

• discover

• source / unsource / sources

• list

• install / update

• remove

Page 39: Lehmanns Rails Erweitern

Beispiel: acts_as_ferret

class Question < ActiveRecord::Base acts_as_ferret :fields =>

[:title, :text]end

Question.find_by_contents('foo')

Page 40: Lehmanns Rails Erweitern

Model-Plugins

• acts_as_state_machine

• acts_as_taggable

• acts_as_versioned

• acts_as_translatable

• attachment_fu

• acts_as_rateable

Page 41: Lehmanns Rails Erweitern

Authentifizierung

• acts_as_authenticated

• authorization

• restful_authentication

• openid_authentication

Page 42: Lehmanns Rails Erweitern

Tests

• selenium_on_rails

• rspec (Behaviour Driven Development)

• rcov (Test coverage)

• ...

Page 43: Lehmanns Rails Erweitern

Sonstiges

• Streamlined

• HOBO

• und >400 mehr

• http://www.agilewebdevelopment.com/

Page 44: Lehmanns Rails Erweitern

Eigene Erweiterungen

Page 45: Lehmanns Rails Erweitern

• Funktionalität bestimmen

• Plugin-Generator anwerfen

• Funktionalität implementieren

Eigene Plugins

Page 46: Lehmanns Rails Erweitern

• acts_as_amazon_book

• ruby script/generate plugin acts_as_amazon_book

Eigene Plugins

Page 47: Lehmanns Rails Erweitern

• acts_as_amazon_book

• ruby script/generate plugin acts_as_amazon_book

Eigene Plugins

Page 48: Lehmanns Rails Erweitern

vendor\plugins\acts_as_amazon_book

init.rb

install.rb

uninstall.rb

vendor\plugins\acts_as_amazon\lib

acts_as_amazon_book.rb

vendor\plugin\acts_as_amazon\tasks

Plugin Anatomie

Page 49: Lehmanns Rails Erweitern

acts_as_amazon_book.rb

Page 50: Lehmanns Rails Erweitern

Plugin-Nutzung

Page 51: Lehmanns Rails Erweitern

• Rails Generatoren in

lib\rails_generator\generators\components

• Eigene Generatorn in lib\generators

Eigene Generatoren

Page 52: Lehmanns Rails Erweitern

• Generatoren sind in Rails an vielen Stellen

• Eigener Scaffolder Generator wii_scaffolder

• Rails scaffolder als Ausgangspunkt

Eigene Generatoren

Page 53: Lehmanns Rails Erweitern

• Jeder Generator erbt von Rails::Generator::Base bzw. Rails::Generator::NamedBase

• Regeln zur Erstellung / Anpassung von Dateien / Templates

• Implementierung der Methode manifest

Generator-Anatomie

Page 54: Lehmanns Rails Erweitern

record do |m| m.file(…) m.directory(…) … end

Generator-Anatomie

Page 55: Lehmanns Rails Erweitern

Generator-Anatomie

Page 56: Lehmanns Rails Erweitern

• ruby script/generate wii_scaffolder Book books list

• „Erzeuge mir mit Hilfe des wii_scaffold-Generators ein Modell Book mit einem Controller books und einer Action list“

wii_scaffold anwenden

Page 57: Lehmanns Rails Erweitern

wii_scaffold anwenden

Erzeugte Dateien:

app/model/book.rb

public/stylesheets/wii_scaffold.css

app/views/book/list.rhtml

app/controllers/books_controller.rb

app/views/layouts/books.rhtml

Page 58: Lehmanns Rails Erweitern

wii_scaffold anwenden

Page 59: Lehmanns Rails Erweitern

• Code und zusätzliche Dateien verteilen

• RubyGems als standardisiertes Distributionswerkzeug

• Plugins auch direkt über SVN installierbar

ruby script/plugin install \

http://svn.meinsubversion.com/mein/plugin

Erweiterung verteilen

Page 60: Lehmanns Rails Erweitern

RubyGem

• Ausgangspunkt jeder Gem ist die Datei .gemspec

• Ruby-basierte Spezifikation der zu „verpackenden“ Erweiterung

Page 61: Lehmanns Rails Erweitern

• gem build acts_as_amazon_book.gemspec

• => acts_as_amazon_book-0.0.1.gem

• gem install acts_as_amazon_book-0.0.1.gem

• gem server

RubyGem

Page 62: Lehmanns Rails Erweitern

• gem build acts_as_amazon_book.gemspec

• => acts_as_amazon_book-0.0.1.gem

• gem install acts_as_amazon_book-0.0.1.gem

• gem server

RubyGem

Page 63: Lehmanns Rails Erweitern

DankeFragen?

• http://www.rubyonrails.org

• http://www.rubyonrails-ug.de

• http://www.railsjobs.de/