74
!"#$$%$$ Javascript and Ruby Frameworks Wynn Netherland

Javascript And Ruby Frameworks

Embed Size (px)

DESCRIPTION

My slide deck from Lone Star Ruby Conference 2008

Citation preview

Page 1: Javascript And Ruby Frameworks

!"#$$%$$

Javascript andRuby Frameworks

Wynn Netherland

Page 2: Javascript And Ruby Frameworks

!"#$$%$$ Wynn Netherland

wynn$ script/generate presentation javascript_and_ruby_frameworks

create slides/images/

create slides/title.slide

create slides/icebreaker.slide

create slides/witty.joke

create slides/wrapup.slide

Page 3: Javascript And Ruby Frameworks

!"#$$%$$ Wynn Netherland

RailsMerbCampingSinatra

RubyPrototypescript.aculo.usjQueryMooToolsYUIExtJS

Javascript

Page 4: Javascript And Ruby Frameworks

!"#$$%$$ Wynn Netherland

Speaker notes

Page 5: Javascript And Ruby Frameworks

!"#$$%$$ Wynn Netherland

RailsMerbCampingSinatra

RubyPrototypescript.aculo.usjQueryMooToolsYUIExtJS

Javascript

MerbjQuery

Page 6: Javascript And Ruby Frameworks

!"#$$%$$ Wynn Netherland

“In short, this is a crash course in how to marry the rapid development approaches that are the core of both Ruby web frameworks and jQuery to build a super-charged environment for quickly prototyping applications. And because Ruby on Rails and Merb are very similar, we’ll be able to cover both web frameworks in a single talk.”

Using jQuery with Ruby Web Frameworks - Yehuda Katz

Page 7: Javascript And Ruby Frameworks

!"#$$%$$

Who is this Yehuda cat?

Wynn Netherland

(and why is he giving my talk tomorrow?)

Page 8: Javascript And Ruby Frameworks

!"#$$%$$

Let’s see what we candig up on the interweb.

Wynn Netherland

Page 9: Javascript And Ruby Frameworks

!"#$$%$$ Wynn Netherland

Page 10: Javascript And Ruby Frameworks

!"#$$%$$ Wynn Netherland

Page 11: Javascript And Ruby Frameworks

!"#$$%$$ Wynn Netherland

Page 12: Javascript And Ruby Frameworks

!"#$$%$$

I’m so excited I gotta tell ya...(Katz’s never kloses!)

Wynn Netherland

Page 13: Javascript And Ruby Frameworks

!"#$$%$$ Wynn Netherland

Page 14: Javascript And Ruby Frameworks

!"#$$%$$ Wynn Netherland

Just about anybody can write for this label it would seem.

Page 15: Javascript And Ruby Frameworks

!"#$$%$$ Wynn Netherland

Page 16: Javascript And Ruby Frameworks

!"#$$%$$

Yehuda Katz

Wynn Netherland

- Merb core developer- jQuery committer- DataMapper contributor

Page 17: Javascript And Ruby Frameworks

!"#$$%$$ Wynn Netherland

Page 18: Javascript And Ruby Frameworks

!"#$$%$$

Yehuda Katz

Wynn Netherland

10:00 am Using jQuery with Ruby Web Frameworks

Don’t miss it!

Page 19: Javascript And Ruby Frameworks

!"#$$%$$ Wynn Netherland

in stores now

April 2009

Page 20: Javascript And Ruby Frameworks

!"#$$%$$

so how do we want to spend the next 30 minutes?

Wynn Netherland

Page 21: Javascript And Ruby Frameworks

!"#$$%$$ Wynn Netherland

wynn$ script/destroy presentation javascript_and_ruby_frameworks

notempty slides/images/

rm slides/title.slide

rm slides/icebreaker.slide

rm slides/witty.joke

rm slides/wrapup.slide

Page 22: Javascript And Ruby Frameworks

!"#$$%$$

Why Javascript at a Ruby conference?

Wynn Netherland

Page 23: Javascript And Ruby Frameworks

!"#$$%$$

Why’s Javascript framework

Wynn Netherland

Page 24: Javascript And Ruby Frameworks

!"#$$%$$ Wynn Netherland

Why Javascript frameworks?

Page 25: Javascript And Ruby Frameworks

!"#$$%$$

Abstract browser quirks!

Wynn Netherland

navigator.userAgent.indexOf(“MSIE”)

Page 26: Javascript And Ruby Frameworks

!"#$$%$$

Extend the language

Wynn Netherland

["foo", "bar"].each(function(i) {

console.log(i);

});

Page 27: Javascript And Ruby Frameworks

!"#$$%$$

Nifty Ajaxi!cation

Wynn Netherland

$("#fighter").load("/fighters/1/specs #fighter .specs");

new Ajax.Updater(container, url);

Page 28: Javascript And Ruby Frameworks

!"#$$%$$

Event sanity

Wynn Netherland

$('foo').observe('click', clickMe);

Page 29: Javascript And Ruby Frameworks

!"#$$%$$

E"ects!

Wynn Netherland

$("#fighter").show("slow");

Page 30: Javascript And Ruby Frameworks

!"#$$%$$

E"ects!

Wynn Netherland

$("#fighter").show("slow");

Page 31: Javascript And Ruby Frameworks

!"#$$%$$

The lineup

Wynn Netherland

Page 32: Javascript And Ruby Frameworks

!"#$$%$$

Prototype

Wynn Netherland

Page 33: Javascript And Ruby Frameworks

!"#$$%$$

Prototype

Wynn Netherland

script.aculo.us

Page 34: Javascript And Ruby Frameworks

!"#$$%$$

Prototype

Wynn Netherland

- Integrated with Rails but easily used alone- OOP enhancements with Class.create- Utility functions

- Try.these- $, $$, $F, $A, $w

- Robust Ajax support

Page 35: Javascript And Ruby Frameworks

!"#$$%$$

Prototype and script.aculo.us

Wynn Netherland

- E"ects!- Appear, Fade, Blinds, Pu", etc.

- Drag and drop!- Buildervar element = Builder.node('p', { className:'error' },

'An error has occurred');

Page 36: Javascript And Ruby Frameworks

!"#$$%$$

jQuery

Wynn Netherland

Page 37: Javascript And Ruby Frameworks

!"#$$%$$

jQuery

Wynn Netherland

is not a database tool for Java

Page 38: Javascript And Ruby Frameworks

!"#$$%$$

jQuery

Wynn Netherland

- Syntax based on chaining$("p").text("boo-yah!").show("slow");

- Less code means less iteration irritation- Simpler Ajax$("#portfolio").load("/stocks .prices");

- Can still get down and dirty $.ajax({

type: "POST", url: "/search",

data: "q=pizza&loc=76227", success: function(msg){

alert( "Search results: " + msg ); }

});

Page 39: Javascript And Ruby Frameworks

!"#$$%$$

jQuery

Wynn Netherland

- Powerful core e"ects- Fade, Blinds, etc.- animate!

$(".message").animate({

"left": "50",

"opacity": 1

}, 500

);

- Designed for plugins- Plays well with others$j = jQuery.noConflict();

Page 40: Javascript And Ruby Frameworks

!"#$$%$$

Yehuda Katz

Wynn Netherland

10:00 am Using jQuery with Ruby Web Frameworks

Did I mention Yehuda is here?

Page 41: Javascript And Ruby Frameworks

!"#$$%$$

MooTools

Wynn Netherland

Page 42: Javascript And Ruby Frameworks

!"#$$%$$

MooTools

Wynn Netherland

- Language enhancements- Array, Hash, Number- OOP extensions with Class, Class.Extras

- Powerful Fx- Ajax- Popular with the designer types

(everything this community does is eye candy)

Page 43: Javascript And Ruby Frameworks

!"#$$%$$

Yahoo! User Interface (YUI)

Wynn Netherland

Page 44: Javascript And Ruby Frameworks

!"#$$%$$

Yahoo! User Interface (YUI)

Wynn Netherland

- More than Javascript a framework- CSS tools, UI design patterns, controls

- Namespaces YAHOO.util.Event.on(

YAHOO.util.Dom.get('user-profile'),

'click',

function(ev) {

YAHOO.util.Event.stopEvent(ev);

// code goes here

}

);

- Verbose

Page 45: Javascript And Ruby Frameworks

!"#$$%$$

ExtJS

Wynn Netherland

Page 46: Javascript And Ruby Frameworks

!"#$$%$$

ExtJS

Wynn Netherland

- They did what with Javascript?- ExtJS.describe() => "Cross-Browser Rich Internet Application Framework"

- Great GUI components (more on that in moment)

Page 47: Javascript And Ruby Frameworks

!"#$$%$$

So how do all of these play with Ruby?

Wynn Netherland

Page 48: Javascript And Ruby Frameworks

!"#$$%$$

Approach #1: Helpers

Wynn Netherland

Page 49: Javascript And Ruby Frameworks

!"#$$%$$

Approach #1: Helpers

Wynn Netherland

OH: "you don't want to handle this stu" directly"

Page 50: Javascript And Ruby Frameworks

!"#$$%$$

Approach #1: Helpers

Wynn Netherland

OH: "you don't want to handle this stu" directly"

Page 51: Javascript And Ruby Frameworks

!"#$$%$$

Helpers

Wynn Netherland

- Clean, tested, less error-prone writing of Javascript- Stay in Ruby, less tag soup in your views<%= link_to_remote "View lesson", {

:url => {

:controller => “lessons”,

:action => “show”,

:id => lesson.id

}, :method => :get } %>

<%= sortable_element("top-ten", :url => { :action =>

"order" }) %>

Page 52: Javascript And Ruby Frameworks

!"#$$%$$

Helpers

Wynn Netherland

keep an eye on 'em

Page 53: Javascript And Ruby Frameworks

!"#$$%$$

Helpers

Wynn Netherland

keep an eye on 'em

Page 54: Javascript And Ruby Frameworks

!"#$$%$$

When Helpers are less than helpful

Wynn Netherland

Consider your DRY view code:<table id="users_list">

<% @users.each do |user| -%> <tr id="user_<%= user.id %>">

<td><%= user.login %></td> <td>

<%= link_to_remote( 'Delete',

:url => user_path(user), :method => 'delete',

:confirm => 'Are you sure?', :complete => "Effect.DropOut('user_#{user.id}')",

:failure => 'alert("Could not delete user: #{user.login}")' )

%> </td>

</tr> <% end -%>

</table>

http://blog.solnic.eu/2007/10/30/why-javascript-helpers-in-rails-are-evil

Page 55: Javascript And Ruby Frameworks

!"#$$%$$

When Helpers are less than helpful

Wynn Netherland

Wet and sloppy in the browser<table id="users_list">

<tr id="user_2"> <td>jane</td>

<td> <a href="#" onclick="if (confirm('Are you sure?')) { new Ajax.Request('/users/2',

{asynchronous:true, evalScripts:true, method: 'delete', onComplete:function(request){Effect.DropOut('user_2')}, onFailure:function(request){alert('Could not delete user:

jane')}}); }; return false;">Delete</a> </td>

</tr> <tr id="user_1">

<td>john</td> <td>

<a href="#" onclick="if (confirm('Are you sure?')) { new Ajax.Request('/users/1', {asynchronous:true, evalScripts:true, method: 'delete', onComplete:function(request)

{Effect.DropOut('user_1')}, onFailure:function(request){alert('Could not delete user: john')}}); }; return false;">Delete</a>

</td> </tr>

<tr id="user_4"> <td>paul</td>

<td> <a href="#" onclick="if (confirm('Are you sure?')) { new Ajax.Request('/users/4',

http://blog.solnic.eu/2007/10/30/why-javascript-helpers-in-rails-are-evil

Page 56: Javascript And Ruby Frameworks

!"#$$%$$

When Helpers are less than helpful

Wynn Netherland

Wet and sloppy in the browser<table id="users_list">

<tr id="user_2"> <td>jane</td>

<td> <a href="#" onclick="if (confirm('Are you sure?')) { new Ajax.Request('/users/2',

{asynchronous:true, evalScripts:true, method: 'delete', onComplete:function(request){Effect.DropOut('user_2')}, onFailure:function(request){alert('Could not delete user:

jane')}}); }; return false;">Delete</a> </td>

</tr> <tr id="user_1">

<td>john</td> <td>

<a href="#" onclick="if (confirm('Are you sure?')) { new Ajax.Request('/users/1', {asynchronous:true, evalScripts:true, method: 'delete', onComplete:function(request)

{Effect.DropOut('user_1')}, onFailure:function(request){alert('Could not delete user: john')}}); }; return false;">Delete</a>

</td> </tr>

<tr id="user_4"> <td>paul</td>

<td> <a href="#" onclick="if (confirm('Are you sure?')) { new Ajax.Request('/users/4',

http://blog.solnic.eu/2007/10/30/why-javascript-helpers-in-rails-are-evil

Page 57: Javascript And Ruby Frameworks

!"#$$%$$

Approach #2: Unobtrusive Javascript (UJS)

Wynn Netherland

Page 58: Javascript And Ruby Frameworks

!"#$$%$$

When Helpers are less than helpful

Wynn Netherland

- Just write good markup<table id="users_list">

<tr id="user_2"> <td>jane</td>

<td><a href="/users/2/confirm_delete">Delete</a></td> </tr>

<tr id="user_1"> <td>john</td>

<td><a href="/users/1/confirm_delete">Delete</a></td> </tr>

<tr id="user_4"> <td>paul</td>

<td><a href="/users/4/confirm_delete">Delete</a></td> </tr>

<tr id="user_3"> <td>peter</td>

<td><a href="/users/3/confirm_delete">Delete</a></td> </tr>

</table>

- Design for no Javascript !rst (if feasible)

http://blog.solnic.eu/2007/10/30/why-javascript-helpers-in-rails-are-evil

Page 59: Javascript And Ruby Frameworks

!"#$$%$$

When Helpers are less than helpful

Wynn Netherland

Add Hijack the behavior later! (Prototype example)var Users = {

onWindowLoad : function() { $('users_list').getElementsBySelector('tr').each(function(userRow){

userRow.down('a').observe('click', Users.onUserDelete); });

},

onUserDelete : function(event) { if(confirm('Are you sure?')) {

var userId = Event.element(event).up('tr').id.split('_').last(); new Ajax.Request(

'/users/'+userId, { method : 'delete',

on200 : function(){ Effect.DropOut('user_'+userId) }, on500 : function(xhr){ alert(xhr.responseText) }

}); }

}}

Event.observe(window, 'load', Users.onWindowLoad);

http://blog.solnic.eu/2007/10/30/why-javascript-helpers-in-rails-are-evil

Page 60: Javascript And Ruby Frameworks

!"#$$%$$

UJS tools

Wynn Netherland

- jQuery- Support UJS out of the box by design

- Dan Webb's LowPro- Create class-based inheritable behaviors- Easily attach/detach behavior to elements

- LowPro for jQuery- Ports Class.create to jQuery

- http://ujs4rails.com/ (still active?)

Page 61: Javascript And Ruby Frameworks

!"#$$%$$

Approach #3: Widgets

Wynn Netherland

UI controls, components, thingamabobbers

Page 62: Javascript And Ruby Frameworks

!"#$$%$$

Widgets

Wynn Netherland

- Tabs- Grids- Date pickers- Dialogs- Panels- Sliders

Page 63: Javascript And Ruby Frameworks

!"#$$%$$

Framework support for UI components

Wynn Netherland

- jQuery- jQuery UI (themeable!)- http://plugins.jquery.com

- Prototype- LivePipe UI- http://scripteka.com

- YUI- Huge set of built-in controls and widgets

- ExtJS- Slickest grids and tabs around- Dual licensed, read carefully

Page 64: Javascript And Ruby Frameworks

!"#$$%$$

Approach #4: MVC in the browser

Wynn Netherland

Page 65: Javascript And Ruby Frameworks

!"#$$%$$

MVC in the browser

Wynn Netherland

Jerry: "Ah, you're crazy."Kramer: "Am I? Or am I so sane that you just blew your mind?!"Jerry: "It's impossible!"Kramer: "Is it? Or is it so possible that your head is spinning like a top?!"Jerry: "It can't be."Kramer: "Can it? Or is your entire world just crashing down all around you?"Jerry: "Alright, that's enough."Kramer: "Yaaaaaaahhh!!!"

- Jerry and Kramer, in "The Stall"

Page 66: Javascript And Ruby Frameworks

!"#$$%$$

SproutCore - so crazy it just might work

Wynn Netherland

- Standards based- Build desktop grade apps in your browser- MVC- Databinding - properties, observers- Widgets- Drag-n-drop- Undo/redo- Powers Apple's MobileMe.com service

Page 67: Javascript And Ruby Frameworks

!"#$$%$$

SproutCore - more Ruby #avor!

Wynn Netherland

- Ruby style syntax- Generators!- Fixtures(!)- Uses Merb for local development

Page 68: Javascript And Ruby Frameworks

!"#$$%$$

Demo

Wynn Netherland

Page 69: Javascript And Ruby Frameworks

!"#$$%$$

SproutCore models

Wynn Netherland

// ==========================================================================

// MyApp.Todo// ==========================================================================

require('core');

/** @class

(Document your class here)

@extends SC.Record

@author AuthorName @version 0.1

*/ MyApp.Todo = SC.Record.extend(

/** @scope MyApp.Todo.prototype */ {

todoListType: 'MyApp.TodoList'

}) ;

http://github.com/sproutit/sproutcore/wikis/sproutcore-s-modern-model-layer-part-3

Page 70: Javascript And Ruby Frameworks

!"#$$%$$

SproutCore models

Wynn Netherland

// ==========================================================================

// MyApp.TodoList// ==========================================================================

require('core');

/** @class

(Document your class here)

@extends SC.Record

@author AuthorName @version 0.1

*/

MyApp.TodoList = SC.Record.extend(/** @scope MyApp.TodoList.prototype */ {

todos: SC.Record.hasMany('MyApp.Todo', 'todoList')

}) ;

http://github.com/sproutit/sproutcore/wikis/sproutcore-s-modern-model-layer-part-3

Page 71: Javascript And Ruby Frameworks

!"#$$%$$

SproutCore models

Wynn Netherland

// ==========================================================================

// MyApp.Todo Fixtures// ==========================================================================

require('core') ;

MyApp.FIXTURES = MyApp.FIXTURES.concat([

{ guid: 1,

type: 'Todo', name: "Something to do",

todoList: 1 // the guid of the todo list object this todo is related to },

{ guid: 2,

type: 'Todo', name: "Something else to do",

todoList: 1 },

{ guid: 3,

type: 'Todo', name: "Gee, I'm busy.",

todoList: 1 }

]); http://github.com/sproutit/sproutcore/wikis/sproutcore-s-modern-model-layer-part-3

Page 72: Javascript And Ruby Frameworks

!"#$$%$$

SproutCore models

Wynn Netherland

>>> var c = MyApp.TodoList.find(1).get('todos');

>>> c.count();2

http://github.com/sproutit/sproutcore/wikis/sproutcore-s-modern-model-layer-part-3

Page 73: Javascript And Ruby Frameworks

!"#$$%$$

SproutCore resources

Wynn Netherland

web: http://www.sproutcore.com/

wikis: http://github.com/sproutit/sproutcore/wikis/

Page 74: Javascript And Ruby Frameworks

!"#$$%$$

Thanks!

Wynn Netherland

Drop me a line: [email protected]

Web: http://squeejee.comBlog: http://locomotivation.comCode: http://github.com/squeejee http://github.com/pengwynn

Twitter: pengwynn