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

Javascript And Ruby Frameworks

Jan 28, 2015

Download

Technology

Wynn Netherland

My slide deck from Lone Star Ruby Conference 2008
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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