SlideShare a Scribd company logo
1 of 21
Download to read offline
Einführung in Ruby On Rails
           Architektur und Konzepte




                                 Frank Egger
                                   Okt. 2007
Agenda

  Basis-Sprache Ruby / Programmierparadigmen
  Rails Architekturprinzipien und -eigenschaften
  Spezialthemen
 –   „Scaffolding“, Generatoren, Plugins und Engines
 –   AJAX
 –   Email-Versand
 –   Webservices
 –   Datenbank-Management / -Migrationen
  Testing
  Entwicklungsumgebung

                                                                     Seite 2
            Einführung in Ruby On Rails – Architektur und Konzepte
Die Sprache Ruby - Programmierparadigmen

 Dynamisch typisierte (Script-)Programmiersprache

 Rein objektorientiert und voll funktional                            class RubyClass < SuperClass
                                                                        include RubyModule

 Introspektion/Reflexion, „duck typing“                                 def method(param)
                                                                          @instvar = param
                                                                        end
 principle of least surprise (POLS)                                   end

                                                                      obj = RubyClass.new
                                                                      obj.method(quot;Rubyquot;)
 Erscheinungsjahr ca. 1995

 Einflüsse von Perl, Python, Smalltalk, LISP, u.a.

 Initiator: Yukihiro Matsumoto („Matz“), mittlerweile Open Source

 Garbage Collection, Exceptions, reguläre Ausdrücke, Erweiterung von
 Klassen, Code-Blöcke, RubyGems (Paketmanager), Rdoc (vgl. Javadoc),
 usw.


                                                                                                Seite 3
             Einführung in Ruby On Rails – Architektur und Konzepte
Rails Architekturprinzipien und -merkmale

  MVC Paradigma als Schichtenarchitektur

  Konventionen über Konfigurationen

  „DRY“-Prinzip („Don‘t Repeat Yourself“)

  Plugin-fähige Architektur zur einfachen Erweiterung
  von Anwendungen durch Standardkomponenten

  Eingebaute bzw. ergänzbare Einweg-Generatoren

  Identischer Anwendungsrahmen
  (Verzeichnisse, Struktur)

  Integrierte AJAX-Unterstützung

  Hohe Testbarkeit
                                                                      Seite 4
             Einführung in Ruby On Rails – Architektur und Konzepte
Basiswissen MVC-Paradigma




                                                   Model
Views werden über die                                                     Controller ändert den
Änderungen des Zustandes                                                  Zustand des
des Geschäftsmodells                                                      Geschäftsmodells
informiert




              View                                                      Controller
                                       Views geben die
                                       Benutzerinteraktionen an
                                       den Controller weiter




                                                                                           Seite 5
               Einführung in Ruby On Rails – Architektur und Konzepte
MVC bei Rails


                                                   Controller

                       Request

                                                                             Creates, Reads,
                                                                             Deletes, Modifies
                                                    Redirects



                                              Forwards
                                                                             Model

            Response
                                                                      Provides Data

                                         View

                                        Helper

   Client                                                Web/App-                                Database
                                                          Server



                                                                                                   Seite 6
                   Einführung in Ruby On Rails – Architektur und Konzepte
Rails Controller in Aktion


  Controller steuern Ablauf
  (Routing anpassbar)
                                                      Controller
  Controller verwalten Modell                         class TasksController < ApplicationController

                                                        def show
  Aufruf der Controller über                              @task = Task.find(params[:id])
                                                        end
  Konvention und Introspektion
                                                      end

  Jede Methode im Controller
  entspricht einer ausführbaren Action                                            View


  View erhält Daten (für Vorbelegungen) über                                       show.rhtml
  Instanzvariablen

  Views werden über Konvention vom Controller
  angesprochen bzw. erzeugt

                                                                                                Seite 7
             Einführung in Ruby On Rails – Architektur und Konzepte
Rails Controller – Features und Merkmale
                                                                Controller
  Zugriff auf Session, Cookies, Parameter                       class TasksController < ApplicationController
  über Hashs                                                      include AuthenticatedSystem

                                                                  before_filter :login_required
  Verhalten der Controller kann mit Hilfe                         def access
  von Filtern beeinflusst werden (z.B. für                          user = session[:user]
                                                                    cookie = cookies[:user_cookie]
  Autorisierung, Authentifizierung)                                 param = params[:id]
                                                                  end

  Seitenlayout kann über Controller oder                        end

  Action gesteuert werden
                                                        render(:action => quot;actionquot;, :layout => quot;layoutnamequot;)
                                                        render(:layout => quot;layoutnamequot;)




                                                                                                     Seite 8
              Einführung in Ruby On Rails – Architektur und Konzepte
Rails Model
Model
                                                                         s
class Task < ActiveRecord::Base

  validates_presence_of        :description

  def print
    return quot;Die Aufgabe heißt #{description}.quot;
  end
end


  Validierungen werden im Model definiert

  Durch Ableitung von ActiveRecord werden automatisch getter/setter für
  Attribute erzeugt

  DRY-Prinzip: Definition der Attribute nur in der Datenbank

  Konvention: Tabellennamen immer Plural vom Modellnamen (Legacy-
  Schemata werden auch unterstützt)

  Vererbung (Single Table Inheritance) ist möglich
                                                                             Seite 9
                Einführung in Ruby On Rails – Architektur und Konzepte
Rails Model – Assoziationen / Relationen

       Model                                                            s
       class Task < ActiveRecord::Base

         belongs_to        :user
         ...
       end


       Model
       class User < ActiveRecord::Base

         has_many       :tasks                                          s
         ...
       end


  Relationen textuell beschreiben:
   – 1:1 -> has_one / belongs_to
   – 1:n -> has_many / belongs_to
   – n:m -> has_and_belongs_to_many / has_and_belongs_to_many
  Foreign Keys werden über Konvention benannt: „relationierte Entität“_id

                                                                            Seite 10
               Einführung in Ruby On Rails – Architektur und Konzepte
Rails Views

      Embedded Ruby (ERB) als Templating-Mechanismus

      Datenzugriff über Instanzvariablen des Controllers

      Inkludierung von Seitenteilen möglich (Partials)

      Seitenweises blättern (Pagination)
View
<%= link_to 'Next page', { :page => @task_pages.current.next } if @task_pages.current.next %>


      Neben HTML als Ausgabeformat werden auch Javascript/RJS (AJAX), XML
      und Binärformate unterstützt
Controller                                                    View
                                                              <% for @task in @tasks %>
class TasksController < ApplicationController
                                                              <p class=quot;taskdescriptionquot;>
      def list                                                <%= @task.description %>
       @task_pages, @tasks = paginate :tasks,                 </p>
                             :per_page => 10
      end                                                     <p class=quot;accountablequot;>
                                                              <%= (@task.accountable == 1 ? quot;jaquot; : quot;neinquot;) %>
end                                                           </p> ...

                                                                                                       Seite 11
                    Einführung in Ruby On Rails – Architektur und Konzepte
Rails Anwendungsrahmen

 Jede Rails-Anwendung hat einen identisch aufgebauten
 Anwendungsrahmen

 Über einen Generator wird der Anwendungsrahmen
 angelegt („rails <projektname>“)

 Danach muss nur noch die
 Datenbankverbindung
 konfiguriert werden und die
 Enticklung kann starten




                                                                     Seite 12
            Einführung in Ruby On Rails – Architektur und Konzepte
Scaffolding und Generatoren

  Scaffolding (Gerüstbau)

   – schnelle Abbildung von z. B. CRUD-Methoden auf allen
     Architekturebenen (Modell/Controller/View) „on the fly“

   – Einmalgenerierung von Sourcecode für CRUD-Methoden

  Generatoren

   – Bieten Unterstüzung bei der Erstellung von Architekturelementen
     (Models, Controllers, Views, Helpers)

   – Können komplexe Umgebungen bereitstellen (z.B. Autorisierung / Login)

   – Können Artefakte auch wieder löschen (Verlust von manuell
     hinzugefügtem Sourcecode möglich!)

   – Sind erweiterbar und können als Plugins in Projekten eingebunden
     werden
                                                                        Seite 13
             Einführung in Ruby On Rails – Architektur und Konzepte
Rails und

  Scriptaculous u. Prototype sind in Rails per Default integriert

  RJS (Rails Javascript) vereinfacht die Umsetzung von AJAX-Elementen

  ABER: Keine aufwändigen AJAX-Anwendungen ohne fundiertes Javascript-
  Know How

  Rails ermöglicht die automatische Erkennung von Javascript

   – AJAX-Formulare werden bei fehlender Javascript-Unterstützung des
     Clients in „normale“ Formulare gewandelt

   – ABER: Controller muss beide Varianten beherrschen!
            View
            <% form_remote_tag(:html => { :action =>
                                url_for(:action => quot;createquot;) },
                                :url => { :action => :createAjax },
                                :update => {:failure => quot;inputformquot; },
                                :loading => quot;Element.show('loading')quot;,
                                :loaded => quot;Element.hide('loading')quot; ) do %>

                                                                               Seite 14
              Einführung in Ruby On Rails – Architektur und Konzepte
Email-Versand / (-Empfang) bei Rails

     Email-Versand über ActionMailer-Model

     Aufruf der Model-Methoden zum Versand mit „deliver_Methodenname“

     Email-Inhalt als View-Template

     Multipart-Email möglich

     Mailversand über integrierten „Dummy“-Mailserver testbar
                                                    Model
                                                    class UserNotifier < ActionMailer::Base
                                                      def signup_notification(user)
                                                        url = HOST_URL
                                                        @recipients = quot;#{user.email}quot;
                                                        @from        = quot;f.egger@dpcom.dequot;
                                                        @subject     = quot;Please activate your new accountquot;
                                                        @sent_on     = Time.now
Your account has been created.                          @body[:user] = user
  Username: <%= @user.login %>                          @body[:url] =
Visit this url to activate your account:                   quot;#{url}/account/activate/#{user.activation_code}quot;
                                                      end
  <%= @url %>
                                                    end

                                                                                                   Seite 15
                   Einführung in Ruby On Rails – Architektur und Konzepte
Webservices mit Rails

  Definition einer Webservice-API über ein von ActionWebservice
  abgeleitetes Interface

  Abbilden der API auf einen / mehrere Controller mit einem / mehreren
  Endpoint/s (direct, delegated, layered)

  Einfache und komplexe Parameter-Typen werden unterstützt (z. B. string,
  Model Elemente, arrays, hashs...)

  Unterstützung für WSDLs mit soap4r
Controller
class TaskAPI < ActionWebService::API::Base
    api_method :new_task, :expects => [Task], :returns => [:bool]
end

class TaskController < ApplicationController
   web_service_api TaskAPI

      def new_task(task)
          return task.save
      end
end

                                                                             Seite 16
                    Einführung in Ruby On Rails – Architektur und Konzepte
Datenbank-Management / -Migrationen

  Repräsentation des Schemas in Datenbank-unabhängiger Sprache (Ruby)

  Migrationsscripte enthalten einzelne Updates für Änderungen am Schema
  oder den Daten

  Das Schema wird in der Datenbank versioniert

  Rails kann mit Hilfe der Version automatisch Up-/Down-Migrationen der
  Datenbank vornehmen

  Es existieren per Default drei Datenbanken: Entwicklung, Test, Produktion
                     class CreateUsers < ActiveRecord::Migration
                       def self.up
                         create_table quot;usersquot;, :force => true do |t|
                           t.column :login,            :string
                           t.column :crypted_password, :string
                         end
                       end

                       def self.down
                         drop_table quot;usersquot;
                       end
                     end

                                                                          Seite 17
             Einführung in Ruby On Rails – Architektur und Konzepte
Testing bei Rails
                                                   def setup
                                                     create_fine_working_time
  Grundlage für Testing bilden                     end
  Unit-Tests                                       def test_create_without_task
                                                     @working_time.task = nil
                                                     @working_time.task_id = nil
  Entwicklung und Ausführung                         result = @working_time.save
  vergleichbar mit Junit                             assert !result
                                                     errors = @working_time.errors
  (setup, teardown...)                               assert_not_nil errors[:task_id]
                                                     assert includes_match?(errors[:task_id],
                                                                    'Bitte eine Aufgabe auswählen!')
  Sind aufgrund der dynamischen                    end
  Typisierung sehr wichtig zur                                                  Model-Tests
  Sicherung der Funktionalität bei Refactorings

  Unterteilung der Tests in Unit-Tests (Model) und Functional-Tests
  (Controller / View)

  Bei Functional-Tests werden Requests und Responds gemockt
  (vergleichbar mit HttpUnit + integriertem Webserver)

  E-Mail- und Webservice-Infrastrukturen können gemockt werden
                                                                                                Seite 18
             Einführung in Ruby On Rails – Architektur und Konzepte
Testdatendefinition

  Testdaten werden in „Fixtures“ definiert                                         Fixture
                                                                      <% today = Date.today %>
                                                                      worked_and_traveled:
  Fixtures werden in yaml (vereinfachtes                                id: 1
                                                                        date: <%= (today - 1).to_s :db %>
  XML) formuliert                                                       hours_worked: 5
                                                                        minutes_worked: 30
                                                                        hours_traveled: 2
  Jedes Fixture entspricht einem Datensatz                              minutes_traveled: 30
  in der Datenbank                                                      comment: kunde ausgequetscht
                                                                        task_id: 1
                                                                        project_id: 4
  Fixtures sollten sprechende Bezeichnungen                             user_id: 1

  besitzen                                                            fixtures :working_times

                                                                      def setup
  Fixtures werden vor Ausführung von Tests                              create_fine_working_time
                                                                      end
  automatisch in die Datenbank geladen
                                                                      def test_create_without_task
                                                                       working_times(:worked_and_traveled)
  Als Standard laufen Test-Methoden                                    [...]
  innerhalb einer Transaktion ab                                      end
                                                                                    Model-Tests

  Auch Beziehungen werden in den Testdaten abgebildet

                                                                                                    Seite 19
             Einführung in Ruby On Rails – Architektur und Konzepte
Rails Entwicklungsumgebung

 Aptana Rails / RadRails (basiert auf Eclipse)

   – Syntax Highlighting

   – Code Completion
     (etwas buggy!)

   – Unit-Testing

   – Webserver (WEBrick,
     LightTPD, Mongrel)

   – Generatoren

   – Rake Tasks

   – Rails Plugins

   – RI (API Doku)
                                                                      Seite 20
             Einführung in Ruby On Rails – Architektur und Konzepte
Quellen

  http://www.rubyonrails.org/

  http://www.rubyonrails.de/

  http://www.rubyonrailsblog.com/

  http://www.ruby-lang.org/de/

  http://prototypejs.org/api

  http://www.sitepoint.com/article/learn-ruby-on-rails/

  http://home.vr-web.de/juergen.katins/ruby/buch/




                                                                        Seite 21
               Einführung in Ruby On Rails – Architektur und Konzepte

More Related Content

Viewers also liked

Auf dem Weg zur digitalen Universität - Community Building 2.0
Auf dem Weg zur digitalen Universität - Community Building 2.0Auf dem Weg zur digitalen Universität - Community Building 2.0
Auf dem Weg zur digitalen Universität - Community Building 2.0Mandy Rohs
 
Kompetenzmanagement in der Pflege
Kompetenzmanagement in der PflegeKompetenzmanagement in der Pflege
Kompetenzmanagement in der PflegeChristine Kunzmann
 
eksamensbevis kirstine schlawitz
eksamensbevis kirstine schlawitzeksamensbevis kirstine schlawitz
eksamensbevis kirstine schlawitzKirstine Schlawitz
 
wissensarbeit20_lindner_20100205
wissensarbeit20_lindner_20100205wissensarbeit20_lindner_20100205
wissensarbeit20_lindner_20100205Lindner Martin
 
Investitionsstrategien für B-Städte und B-Lagen
Investitionsstrategien für B-Städte und B-LagenInvestitionsstrategien für B-Städte und B-Lagen
Investitionsstrategien für B-Städte und B-Lagenschwatlomanagement
 
MOOCs: Wie Unternehmen von offenen Online-Kursen profitieren können
MOOCs: Wie Unternehmen von offenen Online-Kursen profitieren könnenMOOCs: Wie Unternehmen von offenen Online-Kursen profitieren können
MOOCs: Wie Unternehmen von offenen Online-Kursen profitieren könnenJochen Robes
 
Aggregieren, kuratieren und publizieren von Inhalten
Aggregieren, kuratieren und publizieren von InhaltenAggregieren, kuratieren und publizieren von Inhalten
Aggregieren, kuratieren und publizieren von InhaltenAxel Quack
 
Evaluation digitaler Lernsysteme? Qualität durch Evaluation
Evaluation digitaler Lernsysteme? Qualität durch EvaluationEvaluation digitaler Lernsysteme? Qualität durch Evaluation
Evaluation digitaler Lernsysteme? Qualität durch EvaluationLindner Martin
 

Viewers also liked (16)

Trends für Schulen
Trends für Schulen Trends für Schulen
Trends für Schulen
 
Auf dem Weg zur digitalen Universität - Community Building 2.0
Auf dem Weg zur digitalen Universität - Community Building 2.0Auf dem Weg zur digitalen Universität - Community Building 2.0
Auf dem Weg zur digitalen Universität - Community Building 2.0
 
Kompetenzmanagement in der Pflege
Kompetenzmanagement in der PflegeKompetenzmanagement in der Pflege
Kompetenzmanagement in der Pflege
 
DOM_OHJELMA
DOM_OHJELMADOM_OHJELMA
DOM_OHJELMA
 
Testpräsi
TestpräsiTestpräsi
Testpräsi
 
eksamensbevis kirstine schlawitz
eksamensbevis kirstine schlawitzeksamensbevis kirstine schlawitz
eksamensbevis kirstine schlawitz
 
wissensarbeit20_lindner_20100205
wissensarbeit20_lindner_20100205wissensarbeit20_lindner_20100205
wissensarbeit20_lindner_20100205
 
Micro Communities
Micro CommunitiesMicro Communities
Micro Communities
 
Binder1
Binder1Binder1
Binder1
 
Investitionsstrategien für B-Städte und B-Lagen
Investitionsstrategien für B-Städte und B-LagenInvestitionsstrategien für B-Städte und B-Lagen
Investitionsstrategien für B-Städte und B-Lagen
 
Alphabetische wörterliste
Alphabetische wörterlisteAlphabetische wörterliste
Alphabetische wörterliste
 
MOOCs: Wie Unternehmen von offenen Online-Kursen profitieren können
MOOCs: Wie Unternehmen von offenen Online-Kursen profitieren könnenMOOCs: Wie Unternehmen von offenen Online-Kursen profitieren können
MOOCs: Wie Unternehmen von offenen Online-Kursen profitieren können
 
Aggregieren, kuratieren und publizieren von Inhalten
Aggregieren, kuratieren und publizieren von InhaltenAggregieren, kuratieren und publizieren von Inhalten
Aggregieren, kuratieren und publizieren von Inhalten
 
DissertationFindings
DissertationFindingsDissertationFindings
DissertationFindings
 
Evaluation digitaler Lernsysteme? Qualität durch Evaluation
Evaluation digitaler Lernsysteme? Qualität durch EvaluationEvaluation digitaler Lernsysteme? Qualität durch Evaluation
Evaluation digitaler Lernsysteme? Qualität durch Evaluation
 
YDS_LinkedIn
YDS_LinkedInYDS_LinkedIn
YDS_LinkedIn
 

Similar to Einführung in Ruby On Rails

An Introduction to Ruby On Rails
An Introduction to Ruby On RailsAn Introduction to Ruby On Rails
An Introduction to Ruby On RailsJonathan Weiss
 
Ruby on Rails in a metro session
Ruby on Rails in a metro sessionRuby on Rails in a metro session
Ruby on Rails in a metro sessionVirttoo org
 
Refactoring Rails Applications
Refactoring Rails ApplicationsRefactoring Rails Applications
Refactoring Rails ApplicationsJonathan Weiss
 
Informatik Seminar Groovy Und Grails
Informatik Seminar Groovy Und GrailsInformatik Seminar Groovy Und Grails
Informatik Seminar Groovy Und Grailsschmichri
 
ASP.NET MVC 2 - Eine Einführung
ASP.NET MVC 2 - Eine EinführungASP.NET MVC 2 - Eine Einführung
ASP.NET MVC 2 - Eine EinführungNETUserGroupBern
 
EAI mit Mashups
EAI mit MashupsEAI mit Mashups
EAI mit Mashupsdanadx
 
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDI
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDISchlanke Webarchitekturen nicht nur mit JSF 2 und CDI
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDIadesso AG
 
Grails im Überblick und in der Praxis
Grails im Überblick und in der PraxisGrails im Überblick und in der Praxis
Grails im Überblick und in der PraxisTobias Kraft
 
2007 - Basta!: Nach soa kommt soc
2007 - Basta!: Nach soa kommt soc2007 - Basta!: Nach soa kommt soc
2007 - Basta!: Nach soa kommt socDaniel Fisher
 
Metaprogrammierung und Reflection
Metaprogrammierung und ReflectionMetaprogrammierung und Reflection
Metaprogrammierung und ReflectionStefan Marr
 
DOAG: NoSQL with MySQL
DOAG: NoSQL with MySQLDOAG: NoSQL with MySQL
DOAG: NoSQL with MySQLFromDual GmbH
 
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10Ralf Sigmund
 
PHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-AnsätzePHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-AnsätzeRalf Lütke
 
Bkr Workflow Oeffentlich
Bkr Workflow OeffentlichBkr Workflow Oeffentlich
Bkr Workflow OeffentlichRalf Ruethlein
 
Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Josef Adersberger
 
Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?QAware GmbH
 

Similar to Einführung in Ruby On Rails (20)

An Introduction to Ruby On Rails
An Introduction to Ruby On RailsAn Introduction to Ruby On Rails
An Introduction to Ruby On Rails
 
Ruby on Rails in a metro session
Ruby on Rails in a metro sessionRuby on Rails in a metro session
Ruby on Rails in a metro session
 
Refactoring Rails Applications
Refactoring Rails ApplicationsRefactoring Rails Applications
Refactoring Rails Applications
 
Ruby on Rails SS09 11
Ruby on Rails SS09 11Ruby on Rails SS09 11
Ruby on Rails SS09 11
 
Informatik Seminar Groovy Und Grails
Informatik Seminar Groovy Und GrailsInformatik Seminar Groovy Und Grails
Informatik Seminar Groovy Und Grails
 
ASP.NET MVC 2 - Eine Einführung
ASP.NET MVC 2 - Eine EinführungASP.NET MVC 2 - Eine Einführung
ASP.NET MVC 2 - Eine Einführung
 
EAI mit Mashups
EAI mit MashupsEAI mit Mashups
EAI mit Mashups
 
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDI
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDISchlanke Webarchitekturen nicht nur mit JSF 2 und CDI
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDI
 
Grails im Überblick und in der Praxis
Grails im Überblick und in der PraxisGrails im Überblick und in der Praxis
Grails im Überblick und in der Praxis
 
AngularJS
AngularJSAngularJS
AngularJS
 
2007 - Basta!: Nach soa kommt soc
2007 - Basta!: Nach soa kommt soc2007 - Basta!: Nach soa kommt soc
2007 - Basta!: Nach soa kommt soc
 
react-de.pdf
react-de.pdfreact-de.pdf
react-de.pdf
 
Metaprogrammierung und Reflection
Metaprogrammierung und ReflectionMetaprogrammierung und Reflection
Metaprogrammierung und Reflection
 
Net@night asp.net mvc
Net@night asp.net mvcNet@night asp.net mvc
Net@night asp.net mvc
 
DOAG: NoSQL with MySQL
DOAG: NoSQL with MySQLDOAG: NoSQL with MySQL
DOAG: NoSQL with MySQL
 
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
 
PHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-AnsätzePHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-Ansätze
 
Bkr Workflow Oeffentlich
Bkr Workflow OeffentlichBkr Workflow Oeffentlich
Bkr Workflow Oeffentlich
 
Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?
 
Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?
 

Einführung in Ruby On Rails

  • 1. Einführung in Ruby On Rails Architektur und Konzepte Frank Egger Okt. 2007
  • 2. Agenda Basis-Sprache Ruby / Programmierparadigmen Rails Architekturprinzipien und -eigenschaften Spezialthemen – „Scaffolding“, Generatoren, Plugins und Engines – AJAX – Email-Versand – Webservices – Datenbank-Management / -Migrationen Testing Entwicklungsumgebung Seite 2 Einführung in Ruby On Rails – Architektur und Konzepte
  • 3. Die Sprache Ruby - Programmierparadigmen Dynamisch typisierte (Script-)Programmiersprache Rein objektorientiert und voll funktional class RubyClass < SuperClass include RubyModule Introspektion/Reflexion, „duck typing“ def method(param) @instvar = param end principle of least surprise (POLS) end obj = RubyClass.new obj.method(quot;Rubyquot;) Erscheinungsjahr ca. 1995 Einflüsse von Perl, Python, Smalltalk, LISP, u.a. Initiator: Yukihiro Matsumoto („Matz“), mittlerweile Open Source Garbage Collection, Exceptions, reguläre Ausdrücke, Erweiterung von Klassen, Code-Blöcke, RubyGems (Paketmanager), Rdoc (vgl. Javadoc), usw. Seite 3 Einführung in Ruby On Rails – Architektur und Konzepte
  • 4. Rails Architekturprinzipien und -merkmale MVC Paradigma als Schichtenarchitektur Konventionen über Konfigurationen „DRY“-Prinzip („Don‘t Repeat Yourself“) Plugin-fähige Architektur zur einfachen Erweiterung von Anwendungen durch Standardkomponenten Eingebaute bzw. ergänzbare Einweg-Generatoren Identischer Anwendungsrahmen (Verzeichnisse, Struktur) Integrierte AJAX-Unterstützung Hohe Testbarkeit Seite 4 Einführung in Ruby On Rails – Architektur und Konzepte
  • 5. Basiswissen MVC-Paradigma Model Views werden über die Controller ändert den Änderungen des Zustandes Zustand des des Geschäftsmodells Geschäftsmodells informiert View Controller Views geben die Benutzerinteraktionen an den Controller weiter Seite 5 Einführung in Ruby On Rails – Architektur und Konzepte
  • 6. MVC bei Rails Controller Request Creates, Reads, Deletes, Modifies Redirects Forwards Model Response Provides Data View Helper Client Web/App- Database Server Seite 6 Einführung in Ruby On Rails – Architektur und Konzepte
  • 7. Rails Controller in Aktion Controller steuern Ablauf (Routing anpassbar) Controller Controller verwalten Modell class TasksController < ApplicationController def show Aufruf der Controller über @task = Task.find(params[:id]) end Konvention und Introspektion end Jede Methode im Controller entspricht einer ausführbaren Action View View erhält Daten (für Vorbelegungen) über show.rhtml Instanzvariablen Views werden über Konvention vom Controller angesprochen bzw. erzeugt Seite 7 Einführung in Ruby On Rails – Architektur und Konzepte
  • 8. Rails Controller – Features und Merkmale Controller Zugriff auf Session, Cookies, Parameter class TasksController < ApplicationController über Hashs include AuthenticatedSystem before_filter :login_required Verhalten der Controller kann mit Hilfe def access von Filtern beeinflusst werden (z.B. für user = session[:user] cookie = cookies[:user_cookie] Autorisierung, Authentifizierung) param = params[:id] end Seitenlayout kann über Controller oder end Action gesteuert werden render(:action => quot;actionquot;, :layout => quot;layoutnamequot;) render(:layout => quot;layoutnamequot;) Seite 8 Einführung in Ruby On Rails – Architektur und Konzepte
  • 9. Rails Model Model s class Task < ActiveRecord::Base validates_presence_of :description def print return quot;Die Aufgabe heißt #{description}.quot; end end Validierungen werden im Model definiert Durch Ableitung von ActiveRecord werden automatisch getter/setter für Attribute erzeugt DRY-Prinzip: Definition der Attribute nur in der Datenbank Konvention: Tabellennamen immer Plural vom Modellnamen (Legacy- Schemata werden auch unterstützt) Vererbung (Single Table Inheritance) ist möglich Seite 9 Einführung in Ruby On Rails – Architektur und Konzepte
  • 10. Rails Model – Assoziationen / Relationen Model s class Task < ActiveRecord::Base belongs_to :user ... end Model class User < ActiveRecord::Base has_many :tasks s ... end Relationen textuell beschreiben: – 1:1 -> has_one / belongs_to – 1:n -> has_many / belongs_to – n:m -> has_and_belongs_to_many / has_and_belongs_to_many Foreign Keys werden über Konvention benannt: „relationierte Entität“_id Seite 10 Einführung in Ruby On Rails – Architektur und Konzepte
  • 11. Rails Views Embedded Ruby (ERB) als Templating-Mechanismus Datenzugriff über Instanzvariablen des Controllers Inkludierung von Seitenteilen möglich (Partials) Seitenweises blättern (Pagination) View <%= link_to 'Next page', { :page => @task_pages.current.next } if @task_pages.current.next %> Neben HTML als Ausgabeformat werden auch Javascript/RJS (AJAX), XML und Binärformate unterstützt Controller View <% for @task in @tasks %> class TasksController < ApplicationController <p class=quot;taskdescriptionquot;> def list <%= @task.description %> @task_pages, @tasks = paginate :tasks, </p> :per_page => 10 end <p class=quot;accountablequot;> <%= (@task.accountable == 1 ? quot;jaquot; : quot;neinquot;) %> end </p> ... Seite 11 Einführung in Ruby On Rails – Architektur und Konzepte
  • 12. Rails Anwendungsrahmen Jede Rails-Anwendung hat einen identisch aufgebauten Anwendungsrahmen Über einen Generator wird der Anwendungsrahmen angelegt („rails <projektname>“) Danach muss nur noch die Datenbankverbindung konfiguriert werden und die Enticklung kann starten Seite 12 Einführung in Ruby On Rails – Architektur und Konzepte
  • 13. Scaffolding und Generatoren Scaffolding (Gerüstbau) – schnelle Abbildung von z. B. CRUD-Methoden auf allen Architekturebenen (Modell/Controller/View) „on the fly“ – Einmalgenerierung von Sourcecode für CRUD-Methoden Generatoren – Bieten Unterstüzung bei der Erstellung von Architekturelementen (Models, Controllers, Views, Helpers) – Können komplexe Umgebungen bereitstellen (z.B. Autorisierung / Login) – Können Artefakte auch wieder löschen (Verlust von manuell hinzugefügtem Sourcecode möglich!) – Sind erweiterbar und können als Plugins in Projekten eingebunden werden Seite 13 Einführung in Ruby On Rails – Architektur und Konzepte
  • 14. Rails und Scriptaculous u. Prototype sind in Rails per Default integriert RJS (Rails Javascript) vereinfacht die Umsetzung von AJAX-Elementen ABER: Keine aufwändigen AJAX-Anwendungen ohne fundiertes Javascript- Know How Rails ermöglicht die automatische Erkennung von Javascript – AJAX-Formulare werden bei fehlender Javascript-Unterstützung des Clients in „normale“ Formulare gewandelt – ABER: Controller muss beide Varianten beherrschen! View <% form_remote_tag(:html => { :action => url_for(:action => quot;createquot;) }, :url => { :action => :createAjax }, :update => {:failure => quot;inputformquot; }, :loading => quot;Element.show('loading')quot;, :loaded => quot;Element.hide('loading')quot; ) do %> Seite 14 Einführung in Ruby On Rails – Architektur und Konzepte
  • 15. Email-Versand / (-Empfang) bei Rails Email-Versand über ActionMailer-Model Aufruf der Model-Methoden zum Versand mit „deliver_Methodenname“ Email-Inhalt als View-Template Multipart-Email möglich Mailversand über integrierten „Dummy“-Mailserver testbar Model class UserNotifier < ActionMailer::Base def signup_notification(user) url = HOST_URL @recipients = quot;#{user.email}quot; @from = quot;f.egger@dpcom.dequot; @subject = quot;Please activate your new accountquot; @sent_on = Time.now Your account has been created. @body[:user] = user Username: <%= @user.login %> @body[:url] = Visit this url to activate your account: quot;#{url}/account/activate/#{user.activation_code}quot; end <%= @url %> end Seite 15 Einführung in Ruby On Rails – Architektur und Konzepte
  • 16. Webservices mit Rails Definition einer Webservice-API über ein von ActionWebservice abgeleitetes Interface Abbilden der API auf einen / mehrere Controller mit einem / mehreren Endpoint/s (direct, delegated, layered) Einfache und komplexe Parameter-Typen werden unterstützt (z. B. string, Model Elemente, arrays, hashs...) Unterstützung für WSDLs mit soap4r Controller class TaskAPI < ActionWebService::API::Base api_method :new_task, :expects => [Task], :returns => [:bool] end class TaskController < ApplicationController web_service_api TaskAPI def new_task(task) return task.save end end Seite 16 Einführung in Ruby On Rails – Architektur und Konzepte
  • 17. Datenbank-Management / -Migrationen Repräsentation des Schemas in Datenbank-unabhängiger Sprache (Ruby) Migrationsscripte enthalten einzelne Updates für Änderungen am Schema oder den Daten Das Schema wird in der Datenbank versioniert Rails kann mit Hilfe der Version automatisch Up-/Down-Migrationen der Datenbank vornehmen Es existieren per Default drei Datenbanken: Entwicklung, Test, Produktion class CreateUsers < ActiveRecord::Migration def self.up create_table quot;usersquot;, :force => true do |t| t.column :login, :string t.column :crypted_password, :string end end def self.down drop_table quot;usersquot; end end Seite 17 Einführung in Ruby On Rails – Architektur und Konzepte
  • 18. Testing bei Rails def setup create_fine_working_time Grundlage für Testing bilden end Unit-Tests def test_create_without_task @working_time.task = nil @working_time.task_id = nil Entwicklung und Ausführung result = @working_time.save vergleichbar mit Junit assert !result errors = @working_time.errors (setup, teardown...) assert_not_nil errors[:task_id] assert includes_match?(errors[:task_id], 'Bitte eine Aufgabe auswählen!') Sind aufgrund der dynamischen end Typisierung sehr wichtig zur Model-Tests Sicherung der Funktionalität bei Refactorings Unterteilung der Tests in Unit-Tests (Model) und Functional-Tests (Controller / View) Bei Functional-Tests werden Requests und Responds gemockt (vergleichbar mit HttpUnit + integriertem Webserver) E-Mail- und Webservice-Infrastrukturen können gemockt werden Seite 18 Einführung in Ruby On Rails – Architektur und Konzepte
  • 19. Testdatendefinition Testdaten werden in „Fixtures“ definiert Fixture <% today = Date.today %> worked_and_traveled: Fixtures werden in yaml (vereinfachtes id: 1 date: <%= (today - 1).to_s :db %> XML) formuliert hours_worked: 5 minutes_worked: 30 hours_traveled: 2 Jedes Fixture entspricht einem Datensatz minutes_traveled: 30 in der Datenbank comment: kunde ausgequetscht task_id: 1 project_id: 4 Fixtures sollten sprechende Bezeichnungen user_id: 1 besitzen fixtures :working_times def setup Fixtures werden vor Ausführung von Tests create_fine_working_time end automatisch in die Datenbank geladen def test_create_without_task working_times(:worked_and_traveled) Als Standard laufen Test-Methoden [...] innerhalb einer Transaktion ab end Model-Tests Auch Beziehungen werden in den Testdaten abgebildet Seite 19 Einführung in Ruby On Rails – Architektur und Konzepte
  • 20. Rails Entwicklungsumgebung Aptana Rails / RadRails (basiert auf Eclipse) – Syntax Highlighting – Code Completion (etwas buggy!) – Unit-Testing – Webserver (WEBrick, LightTPD, Mongrel) – Generatoren – Rake Tasks – Rails Plugins – RI (API Doku) Seite 20 Einführung in Ruby On Rails – Architektur und Konzepte
  • 21. Quellen http://www.rubyonrails.org/ http://www.rubyonrails.de/ http://www.rubyonrailsblog.com/ http://www.ruby-lang.org/de/ http://prototypejs.org/api http://www.sitepoint.com/article/learn-ruby-on-rails/ http://home.vr-web.de/juergen.katins/ruby/buch/ Seite 21 Einführung in Ruby On Rails – Architektur und Konzepte