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.
-
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.
-
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
- 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:

-
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. - 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 endVoer 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. -
Genereer de Controller bestanden voor CRUD:
jruby script/generate scaffold Book
- 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.
* afgebroken om binnen het scherm te blijvenjruby script/plugin install http://jruby-extras.rubyforge.org/svn /trunk/rails-integration/plugins/goldspike
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. - Maak het WAR bestand met het volgende commando:
jruby –S rake war:standalone:create
- 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.
-
Rol het WAR bestand uit naar application server. Met behulp van de admin web console van Oracle AS kun je een WAR bestand importeren.
-
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.

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.

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
- Ruby:
www.ruby-lang.org/en/ - JRuby:
jruby.codehaus.org - JRuby fix voor Windows padnamen:
jira.codehaus.org/browse/JRUBY-1401 - Bug Ruby on Rails op Oracle AS 10.1.2.0.2:
www.mail-archive.com/jruby-extras-devel@rubyforge.org/msg00466.html - GoldSpike:
www.headius.com/jrubywiki/index.php/Rails_Integration - JRuby-extras Mail Archive:
www.mail-archive.com/jruby-extras-devel@rubyforge.org/index.html - Oracle AS
www.oracle.com/appserver/index.html - Oracle XE
www.oracle.com/technology/products/database/xe/index.html
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.

Reacties
Nieuwe reactie inzenden