lehmanns rails erweitern
DESCRIPTION
Slides of a presentation on Rails and extending Rails with Plugins and such, held at Lehmanns Fachbuchhandlung in Hamburg, at 2007-07-09TRANSCRIPT
Ruby on RailsErweitern
Ramon Wartala - Jan Krutisch9. Juli 2007 - Lehmanns Fachbuchhandlung, Hamburg
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
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
• Dipl.-Inform.
• IT-Leiter bei Orangemedia GmbH
• Einer der führenden Online-Vermarkter
• Autor zahlreicher Artikel und Tagungsbeiträge rund um Softwareentwicklung
Ramon Wartala
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
• 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
Ruby on RailsGrundlagen
Ruby
• 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.
def tausch(x,y)
[y, x]
end
x,y = tausch 1,2
=> x=2, y=1
def tausch(x,y)
[y, x]
end
x,y = tausch 1,2
=> x=2, y=1
Impliziter Rückgabewert
def tausch(x,y)
[y, x]
end
x,y = tausch 1,2
=> x=2, y=1
Impliziter Rückgabewert
Mehrfache Zuweisung
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
Rails
• 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.)
• 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
• Ruby ist nicht sehr performant
• Rails ist nicht sehr performant
• Kein „Allgemeinwissen“
• (Noch) keine "sichere Wahl" für Entscheider
Nachteile von Rails
• ActiveRecord: Objekt-relationaler Mapper
• ActionPack
• ActionView
• ActionController
• ActiveSupport
• ActionMailer
Die Komponenten
Code!
Model
class Book < ActiveRecord::Base
end
Model
Book.find :all
Book.find :first, :conditions =>
["isbn = ?", @isbn]
@book = Book.find_by_isbn(@isbn)
@book.title = "Ruby Cookbook"
@book.save
@book.destroy
Model mit Beziehungen
class Book < ActiveRecord::Base
belongs_to :library
end
class Library < ActiveRecord::Base
has_many :books
end
Model mit Beziehungen
@library = @book.library
@books = @library.books
@book = @library.books.find_by_isbn @isbn
@library << @book
@book.library = @library
Model mit Validierungen
class Book < ActiveRecord::Base
validates_presence_of :title
validates_uniqueness_of :isbn
end
Model mit Validierungen
@book = Book.new
@book.save # => false
@errors = @book.errors
Controller
class BooksController < ApplicationController
def index
@books = Book.find(:all)
end
end
View (HTML)
<ul>
<% for book in @books %>
<li><%=h book.title %></li>
<% end %>
</ul>
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
Weitere Features
Syntaktischer Zucker
• belongs_to :library
• has_many :books
• books_path
• book_path(@book)
Tests
• Basiert auf Test::Unit
• Unit-Tests (Auf Modellebene)
• Funktionale Tests (Auf Controllerebene)
• Integrationstests (Auf Applikationsebene)
• Testausführung automatisiert über Rake
Ajax etc.
• prototype.js
• script.aculo.us
• Helper
• rjs-Templates
Helper
• Textformatierung (Textile / Markdown)
excerpt(text, 'foo')
=> '...und foo ging...'
• Datums-Formatierungen
• Datums-Formular-Helper
• ...
RESTful
• URL = Resource
• GET / POST / PUT / DELETE
• Klare Architektur
• Viele kleine Controller mit wenig Actions
Rails erweitern
Rails erweitern
Durch:
• rake-Tasks
• Mixins
• Generatoren
• RubyGems
• Plugins
Plugins
• Erweitern der Rails-Basisklassen
• Metaprogrammierung!
• Überschreiben, Ergänzen (Mixins)
• Eigene Generatoren
• Eigene Rake-Tasks
Plugin-Skript
• ruby scripts/plugin
• discover
• source / unsource / sources
• list
• install / update
• remove
Beispiel: acts_as_ferret
class Question < ActiveRecord::Base acts_as_ferret :fields =>
[:title, :text]end
Question.find_by_contents('foo')
Model-Plugins
• acts_as_state_machine
• acts_as_taggable
• acts_as_versioned
• acts_as_translatable
• attachment_fu
• acts_as_rateable
Authentifizierung
• acts_as_authenticated
• authorization
• restful_authentication
• openid_authentication
Tests
• selenium_on_rails
• rspec (Behaviour Driven Development)
• rcov (Test coverage)
• ...
Sonstiges
• Streamlined
• HOBO
• und >400 mehr
• http://www.agilewebdevelopment.com/
Eigene Erweiterungen
• Funktionalität bestimmen
• Plugin-Generator anwerfen
• Funktionalität implementieren
Eigene Plugins
• acts_as_amazon_book
• ruby script/generate plugin acts_as_amazon_book
Eigene Plugins
• acts_as_amazon_book
• ruby script/generate plugin acts_as_amazon_book
Eigene Plugins
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
acts_as_amazon_book.rb
Plugin-Nutzung
• Rails Generatoren in
lib\rails_generator\generators\components
• Eigene Generatorn in lib\generators
Eigene Generatoren
• Generatoren sind in Rails an vielen Stellen
• Eigener Scaffolder Generator wii_scaffolder
• Rails scaffolder als Ausgangspunkt
Eigene Generatoren
• Jeder Generator erbt von Rails::Generator::Base bzw. Rails::Generator::NamedBase
• Regeln zur Erstellung / Anpassung von Dateien / Templates
• Implementierung der Methode manifest
Generator-Anatomie
record do |m| m.file(…) m.directory(…) … end
Generator-Anatomie
Generator-Anatomie
• 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
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
wii_scaffold anwenden
• 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
RubyGem
• Ausgangspunkt jeder Gem ist die Datei .gemspec
• Ruby-basierte Spezifikation der zu „verpackenden“ Erweiterung
• 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
• 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
DankeFragen?
• http://www.rubyonrails.org
• http://www.rubyonrails-ug.de
• http://www.railsjobs.de/