Stop writing JavaScript and get back to Ruby!
Remeber that feeling that you had after having tried CoffeeScript getting back to a project with plain JavaScript and felt so constricted?
Well, after re-writing a couple of coffee classes with OpalRuby I felt exactly that way, and with 14.9KB of footprint (min+gz, jQuery is 32KB) is a complete no brainer.
So let’s gobble up our first chunk of code, that will salute from the browser console:
puts 'hi buddies!'
You wonder how that gets translated?
Fear that it will look like this?
'egin',cb='bootstrap',u='clear.cache.gif',z='content',bc='end',lb='gecko',mb='g
cko1_8',yb='gwt.hybrid',xb='gwt/standard/standard.css',E='gwt:onLoadErrorFn',B=
'gwt:onPropertyErrorFn',y='gwt:property',Db='head',qb='hosted.html?hello',Cb='h
ref',kb='ie6',ab='iframe',t='img',bb="javascript:''",zb='link',pb='loadExternal
Refs',v='meta',eb='moduleRequested',ac='moduleStartup',jb='msie',w='name',gb='o
pera',db='position:absolute;width:0;height:0;border:none',Ab='rel',ib='safari',
rb='selectingPermutation',x='startup',m='hello',Bb='stylesheet',ob='unknown',fb
='user.agent',hb='webkit';var fc=window,k=document,ec=fc.__gwtStatsEvent?functi
on(a){return fc.__gwtStatsEvent(a)}:null,zc,pc,kc,jc=l,sc={},Cc=[],yc=[],ic=[],
vc,xc;ec&&ec({moduleName:m,subSystem:x,evtGroup:cb,millis:(new Date()).getTime(
),type:nb});if(!fc.__gwt_stylesLoaded){fc.__gwt_stylesLoaded={}}if(!fc.__gwt_sc
riptsLoaded){fc.__gwt_scriptsLoaded={}}function oc(){var b=false;try{b=fc.exter
Nope! it’s Chuck Testa
(function() {
return this.$puts("hi buddies!")
}).call(Opal.top);
But it will be obviously a mess to integrate it with existing javascript!!1
Let’s how to add #next and #prev to the Element class:
class Element
def next(selector = '')
element = nil
`element = jQuery(this.el).next(selector)[0] || nil;`
Element.new element if element
end
end
But I’m on Rails!
Here you served:
gem 'opal-rails'
Which will provide you requirable libraries for application.js
//= require opal //= require rquery
and the .opal extension for your files
# app/assets/javascripts/hi-world.js.opal puts "G'day world!"
A template handler:
# app/views/posts/show.js.opal.erb
Element.id('<%= dom_id @post %>').show
and a Haml filter!
-# app/views/posts/show.html.haml
%article= post.body
%a#show-comments Display Comments!
.comments(style="display:none;")
- post.comments.each do |comment|
.comment= comment.body
:opal
Document.ready? do
Element.id('show-comments').on :click do
Element.find('.comments').first.show
false # aka preventDefault
end
end