Follow Us on Twitter

Ruby on Rails op Oracle AS

October 2007 - Ruby on Rails is een krachtig framework waarmee in korte tijd web applicaties te bouwen zijn. Met de komst van JRuby wordt het mogelijk om Ruby on Rails applicaties te draaien op Java EE applicatie servers. In dit artikel wordt gekeken hoe Ruby on Rails op een Oracle Application Server uitgerold kan worden.

Wat is Ruby?

Ruby is een programmeertaal waarin alle variabelen objecten zijn. Er bestaan geen primitieve objecten zoals dit bij Java wel het geval is (bijvoorbeeld integers en boolean). Variabelen zijn dynamisch getypeerd in Ruby. Dit houdt in dat het type pas op het moment van executie wordt bepaald. Verder bevat Ruby een aantal interessante features als closures en metaprogramming. Vergeleken met Java is de syntax van Ruby is zeer compact. In tegenstelling tot Java heeft Ruby veel minder bibliotheken van functies. Omdat Ruby een geïnterpreteerde taal hoeft het niet gecompileerd te worden.

Wat is Ruby on Rails?

Ruby on Rails is een open source web framework. Rails heeft zijn populariteit te danken aan zijn eenvoud en productiviteit. Dit heeft te maken met de achterliggende filosofie. Rails hanteert twee principes:

  • Don’t Repeat Yourself (DRY)
    Er wordt zoveel mogelijk code gegenereerd door middel van scripts. Met behulp van het ‘scaffold’ commando wordt CRUD (Create – Read - Update – Delete) functionaliteit voor een bepaald model gegenereerd. Ook database tabellen kunnen met behulp van een commando worden gecreëerd.
  • Convention over Configuration
    Door het volgen van conventies wordt configuratie overbodig gemaakt. Alles wat vanzelfsprekend is hoef je niet te configureren. Zo hoef je bijvoorbeeld niet te configureren dat als er in de app/models een Book klasse is er ook een corresponderende database tabel is genaamd books.

Wat is JRuby?

JRuby is een Ruby implementatie geschreven in Java. Omdat JRuby als runtime omgeving gebruik maakt van de Java Virtual Machine (JVM) is het mogelijk om Java toe te passen. Bijvoorbeeld kan JDBC aangewend worden om te communiceren met databases. Hoewel JRuby niet volledig compatible is met Ruby, zal Ruby code voor het merendeel ook functioneren in JRuby. Met de komst van JRuby is het mogelijk geworden om Ruby applicaties te draaien op een Java EE applicatie server. Java EE applicatie servers zijn doorgaans robuuster en gemakkelijker op te schalen dan hun Ruby tegenhangers.

Ruby on Rails op Oracle AS in 10 stappen

In de hieronder beschreven stappen wordt een eenvoudige applicatie gebouwd. De applicatie bevat een aantal schermen die gegevens uit een database kunnen tonen, toevoegen, bewerken en verwijderen. Als database is Oracle 10g Express Edition gebruikt. De stappen zijn uitgevoerd op een Windows XP machine, maar kunnen zonder wijzigingen ook op andere besturingssystemen worden toegepast. De gebruikte applicatie server is Oracle Application Server 10g versie 10.1.3.3.0. Gebruik niet Oracle Application Server versie 10.1.2.0.2. Deze blijkt kan niet met de WAR van JRuby / GoldSpike te kunnen werken. Er verschijnt een foutmelding: ActionController::RoutingError (no route found to match "/servlet/rails" with {:method=>:get}). Hierover is een melding in de JRuby-extras mailing list.

  1. Download JRuby binary zip van http://dist.codehaus.org/jruby/ (bijvoorbeeld jruby-bin-1.0.zip). Unzip dit bestand naar een locatie naar keuze. Gebruik voor de zekerheid geen spaties in het padnaam. In sommige gevallen kan dit namelijk problemen geven. Maak een environmental variabele JRUBY_HOME aan en voeg %JRUBY_HOME%/bin toe aan de PATH variabele. Om JRuby te kunnen runnen moet je Java Runtime geïnstalleerd hebben. Zet de JAVA_HOME naar de JDK die op de machine geïnstalleerd is; dit kan elke versie zijn vanaf 1.4.2. JDK 1.5.0_13 is gebruikt in de test.

  2. Installeer Rake, Rails en ActiveRecord-JDBC. Rake is een build-tool en is vergelijkbaar met Maven. ActiveRecord is het persistency framework van Ruby. Open de command prompt en voer de volgende commando’s na elkaar uit:

    jruby –S gem install –y rake
    jruby –S gem install –y rails
    jruby –S gem install –y ActiveRecord-JDBC
  3. Maak het skelet van de applicatie door onderstaand commando uit te voeren. In dit geval is de naam van de applicatie ‘demo’.
    jruby –S rails demo

    Na uitvoering van het commando is een directory structuur opgezet met een aantal bestanden:

    directory tree Oracle and Ruby

  4. Maak de database users aan. Het toevoegen van de database users kan met behulp van de Oracle XE web admin tool. Voor de omgevingingen development, test en productie dient een database user aangemaakt te worden.

    Zet de de zojuist aangemaakte database users in het bestand config/database.yml van de in stap 3 gecreëerde rails applicatie:

    development:
      adapter: jdbc
      driver: oracle.jdbc.driver.OracleDriver
      url: jdbc:oracle:thin:@localhost:1521:XE
      username: library_dev
      password: chico123
    
    test:
      adapter: jdbc
      driver: oracle.jdbc.driver.OracleDriver
      url: jdbc:oracle:thin:@localhost:1521:XE
      username: library_test
      password: harpo534
    
    production:
      adapter: jdbc
      driver: oracle.jdbc.driver.OracleDriver
      url: jdbc:oracle:thin:@localhost:1521:XE
      username: library_prod
      password: groucho917
    

    Pas config/environment.rb aan zodat de ActiveRecord JDBC library wordt gebruikt. Zet dit in een regel voor Rails::Initializer.run do |config|

    require ‘jdbc_adapter’ De Oracle JDBC library moet op het classpath staan. Dit kan door het bestand ojdbc14.jar te kopiëren naar de JRUBY_HOMElib folder. 
  5. Genereer de models en controllers. Hieronder wordt het model Book gegenereerd:
    cd demo
    jruby script/generate model Book
    
    Pas de migrate script aan (dbmigrate01_create_books.rb) ; alleen de kolommen (tussen create_table :books do |t| en end) moet je toevoegen:
    class CreateBooks < ActiveRecord::Migration
      def self.up
        create_table :books do |t|
            t.column :title, :string
            t.column :author, :string
        end
        
        data
      end
    
      def self.down
        drop_table :books
      end
    end
    
    Voer deze wijzigingen uit op de database door het zojuist gemaakte script uit te voeren:
    jruby –S rake db:migrate
    
    Default wordt het script op de development database uitgevoerd. Met de toevoeging "RAILS_ENV=production" wordt het script op productie omgeving uitgevoerd. Controleer of de tabel ook daadwerkelijk is aangemaakt.  
  6. Genereer de Controller bestanden voor CRUD:

    jruby script/generate scaffold Book
  7. Voeg de GoldSpike plugin toe aan je web applicatie. GoldSpike is een JRuby plugin die een Web ARchive (WAR) bestand kan genereren van een JRuby on Rails project. WAR is het standaard bestandsformaat voor Java web applicaties. Een WAR bestand kan uitgerold worden op een Java EE compliant web container.

    jruby script/plugin install 
       http://jruby-extras.rubyforge.org/svn
       /trunk/rails-integration/plugins/goldspike
    * afgebroken om binnen het scherm te blijven
    Mogelijk verschijnt er nu een foutmelding. JRuby versie 1.0.1 heeft een bug met betrekking tot het uitlezen van Windows padnamen. De fix staat op: http://jira.codehaus.org/browse/JRUBY-1401. Na toepassing van deze patch lukt bovenstaande commando wel. 

    Kopieer de Oracle driver (ojdbc14.jar) naar de WEB-INF/lib folder.
  8. Maak het WAR bestand met het volgende commando:

    jruby –S rake war:standalone:create
  9. Een bestand met de naam demo.war wordt aangemaakt. Controleer de waarde van de context parameter “rails.env”. Indien nodig wijzig de parameter zodat de web applicatie naar de gewenste omgeving verwijst.  
  10. Rol het WAR bestand uit naar application server. Met behulp van de admin web console van Oracle AS kun je een WAR bestand importeren.

  11. Gebruik de applicatie. De URL http://localhost:8888/demo/ toont de welkom-pagina van Rails. De link About your application’s environment laat een aantal gegevens zien over de omgeving.

    Rails Welcome

    De URL http://localhost:8888/demo/books laat een scherm zien met als titel “Listing books” en een link om een boek toe te voegen “New book”. Door hierop te klikken verschijnt een scherm waarin Title en Author van ingevuld kan worden om aan de database toe te voegen. Nadat een boek is toegevoegd verschijnt de lijst weer met het zojuist toegevoegde boek.

    Rails Listing

Conclusie

Het is dus mogelijk om een Rails applicatie te draaien op Oracle Application Server. Al moet gezegd worden dat op dit moment de performance nog niet geweldig is. Naar verluidt zal de 1.1 release van JRuby aanzienlijk sneller zijn.

Het simpele voorbeeld laat zien dat je met slechts enkele regels code een webapplicatie kunt bouwen. Een hoop dingen hoef je niet te doen. Gelukkig hoef je geen XML te schrijven om te configureren hoe URLs omgezet moeten worden naar aanroepen van de controller methodes. Dit is onderdeel van de conventie. Voor wat betreft de aanroepen naar de database is het een aantrekkelijke gedachte dat deze code niet geschreven moet worden. Eenvoud wil niet zeggen dat je moet inleveren op kwaliteit. Dat je met Rails ook tot complexere dingen in staat bent toont de website basecamp.

Referenties


Over de auteur
Jos Nieuwenhuis is een Java / SOA consultant. Hij combineert ruime ervaring op het gebied van enterprise Java met uitgebreide kennis van integratie en SOA architecturen en oplossingen.

Waardering:
 

Reacties

Nieuwe reactie inzenden

De inhoud van dit veld is privé en zal niet openbaar worden gemaakt.

Meer informatie over formaatmogelijkheden

CAPTCHA
Deze vraag is om te testen of u een persoon bent en om spam te voorkomen
Image CAPTCHA
Enter the characters shown in the image.