Rails combineren met Seaside

November 5, 2006

Het is moeilijk om in Seaside van start te komen vanwege het gebrek aan goede tutorials. In tegenstelling tot DHH, hebben de makers van Seaside de instap vrij hoog gehouden voor newbies. Met rails heb je in vijf minuten je eerste applicatie zonder zelfs een idee te hebben wat de technologie inhoud. Met Seaside moet je er eerste behoorlijk in duiken. Ik zit me wel af te vragen of het niet anders kan en of je niet zoals in rails snel een basis applicatie kunt genereren en van daaruit verder werken. Aan de taal zal het niet liggen: wat in ruby kan, moet in smalltalk ook lukken.
Ik ben dus begonnen wat code te schrijven voor het opzetten van een standaard Seaside applicatie.


WAComponent subclass: #RailsRoot
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Rails'

renderContentOn: html
html heading: 'Hello World ', self className level: 1.

Object subclass: #Rails
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Rails'

generateApp: appName
| appClass |
appClass:=RailsRoot subclass: appName
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: appName.
  appClass registerAsApplication: appName.
Met het volgende commando vanuit de workspace wordt dan een basis applicatie opgezet en opgestart.

Rails generateApp: 'Demo'

Dit is heel triviaal en met het handje heb je het bijna net zo snel gedaan, maar het is gewoon het uitzoekwerk dat mensen afschrikt. Ik moet het een en ander nog bullet proof maken en uitbreiden, maar het is een start.

  1. I do something similar…

    
    newSeasideApp: aName
        | appCategory configCategory prefix appClass sessionClass |
        appCategory := (aName , '-App') asSymbol.
        configCategory := (aName , '-Config') asSymbol.
        prefix := aName select: [:each | each isUppercase].
        SystemOrganization
            addCategory: appCategory;
            addCategory: configCategory.
        appClass := WAComponent
                    subclass: (prefix , aName) asSymbol
                    instanceVariableNames: ''
                    classVariableNames: ''
                    poolDictionaries: ''
                    category: appCategory.
        appClass compile: 'renderContentOn: html' , String cr , String tab , 'html text: ''' , aName , ''''.
        sessionClass := WASession
                    subclass: (prefix , aName , #Session) asSymbol
                    instanceVariableNames: ''
                    classVariableNames: ''
                    poolDictionaries: ''
                    category: configCategory.
        (self confirm: 'Register this in Seaside Admin as an application?')
            ifTrue:
                [(appClass registerAsApplication: aName withFirstCharacterDownshifted)
                    preferenceAt: #sessionClass put: sessionClass;
                    in:
                            [:it |
                            it libraries add: SULibrary]].
        Browser fullOnClass: appClass
    

    Comment by Ramon Leon — November 8, 2006 @ 9:04 pm

  2. Thank you for the code Ramon, I will sure give it a try.

    Comment by soemirno — November 9, 2006 @ 9:12 pm

blog comments powered by Disqus

Get free blog up and running in minutes with Blogsome | Theme designs available here