SlideShare a Scribd company logo
- ROR Lab. Season 3 - 
 70 Biweekly Lecture 
Working with Javascript 
in Rails 
2014-09-16 
SeungKyun Nam
Agenda 
Ajax: Introduction 
Unobtrusive Javascript 
Built-in Helpers 
Ajax: Server-Side Concerns 
Turbolinks
Ajax: Introduction 
What is Ajax: 
Asynchronous 
Javascript 
and 
XML
Ajax: Introduction 
The origin of the term called 'Ajax' 
by Adaptive Path 
Blog post: Ajax: 
but ... 
A New Approach to Web Applications
Ajax: Introduction 
Understanding Request-Response Cycle
Ajax: Introduction 
Classic Model vs AJax Model
Ajax: Introduction 
Synchronous Model vs Asynchronous Model
Ajax: Introduction 
Defining Ajax 
Presentation: XHTML and CSS - HTML5 and CSS3 
Document Object Model 
Data: XML and XSLT - (mostly JSON) 
Carrier: XMLHttpRequest 
Binding everything together: Javascript
Ajax: Introduction 
Sample Code 
// COFFEESCRIPT 
$.ajax(url: /test/lorem).done (html) - 
$(#results).append html 
// Generated JAVASCRIPT 
(function() { 
$.ajax({ 
url: /test/lorem 
}).done(function(html) { 
return $(#results).append(html); 
}); 
}).call(this);
Ajax: Introduction 
Demo
Unobtrusive Javascript 
Three main goals 
To separate JavaScript from HTML markup, as well as 
keeping modules of JavaScript independent of other 
modules. 
Unobtrusive JavaScript should degrade gracefully - all 
content should be available without all or any of the 
JavaScript running successfully. 
Unobtrusive JavaScript should not degrade the 
accessibility of the HTML, and ideally should improve it, 
whether the user has personal disabilities or are using an 
unusual, or unusually configured, browser.
Tip: 
To complie CoffeeScript 
without top-level function safety wrapper 
# Compile the Javascript without the top-level function safety wrapper 
# CoffeeScript Option -b or --bare 
Tilt::CoffeeScriptTemplate.default_bare = true 
config/environment.rb
Traditional Way 
Inline Javascript 
a href=# onclick=this.style.backgroundColor='#009900';this.style.color='#FFFFFF' 
Paint it green 
/a
Traditional (Better) Way 
Using Functions 
paintIt = (element, backgroundColor, textColor) - 
element.style.backgroundColor = backgroundColor 
if textColor? 
element.style.color = textColor 
a href=# onclick=paintIt(this, '#990000')Paint it red/a 
a href=# onclick=paintIt(this, '#009900', '#FFFFFF')Paint it green/a
Unobtrusive Way 
paintIt = (element, backgroundColor, textColor) - 
element.style.backgroundColor = backgroundColor 
if textColor? 
element.style.color = textColor 
$ - 
$(a[data-background-color]).click - 
backgroundColor = $(this).data(background-color) 
textColor = $(this).data[text-color] 
paintIt(this, backgroundColor, textColor) 
a href=# data-background-color=#990000Paint it red/a 
a href=# data-background-color=#009900 data-text-color=#FFFFFFPaint it green/a 
a href=# data-background-color=#000099 data-text-color=#FFFFFFPaint it blue/a
Unobtrusive Javascript 
Demo
Built-in Helpers 
Rails Ajax helpers are in two parts 
Javascript half - rails.js 
Ruby half - add appropriate tags to DOM
form_for 
%= form_for(@post, remote: true) do |f| % 
... 
% end % 
!-- Generated HTML -- 
form accept-charset=UTF-8 
action=/posts 
class=new_post 
data-remote=true 
id=new_post method=post 
... 
/form
form_for 
Adding Ajax Event 
$(document).ready - 
$(#new_post).on(ajax:success), (e, data, status, xhr) - 
$(#new_post).append xhr.responseText 
).bind ajax:error, (e, data, status, error) - 
$(#new_post).append pERROR/p
form_tag 
%= form_tag('/posts', remote: true) %
link_to 
%= link_to a post, @post, remote: true % 
!-- Generated HTML -- 
a href=/https/www.slideshare.net/posts/1 data-remote=truea post/a
link_to 
Adding Ajax Event 
%= link_to Delete Post, @post, remote: true, method: :delete % 
$ - 
$(a[data-remote]).on ajax:success, (e, data, status, xhr) - 
alert The post was deleted.
button_to 
%= button_to A post, @post, remote: true % 
!-- Generated HTML -- 
form action=/posts/1 class=button_to data-remote=true method=post 
divinput type=submit value=A post/div 
/form
Built-in Helpers 
Demo
Server-Side Concerns
Server-Side Concerns 
by Example 
class UsersController  ApplicationController 
def index 
@users = User.all 
@user = User.new 
end 
# ... 
end 
bUsers/b 
ul id=users 
li /li 
/ul 
br 
br 
app/views/users/index.html.erb 
app/controllers/users_controller.rb 
li /li 
app/views/users/_user.html.erb
Server-Side Concerns 
by Example 
# ... 
def create 
@user = User.new(params[:user]) 
respond_to do |format| 
if @user.save 
format.html { redirect_to @user, notice: 'User was successfully created.' } 
format.js {} 
format.json { render json: @user, status: :created, location: @user } 
else 
format.html { render action: new } 
format.json { render json: @user.errors, status: :unprocessable_entity } 
end 
end 
end 
# ... 
app/controllers/users_controller.rb
Server-Side Concerns 
by Example 
$(%= escape_javascript(render @user) %).appendTo(#users) 
app/views/users/create.js.erb
Server-Side Concerns 
Demo
Turbolinks 
Rails 4 Default 
Turbolinks Gem 
Uses Ajax to speed up page rendering 
PushState
Turbolinks 
How it works 
attaches a click handler to all a tags 
check if browser supports PushState 
if so, 
make an Ajax request 
parse the response 
replace the entire body 
change the URL using PushState
PushState 
a part of HTML5 History-API 
!doctype html 
html 
head 
titlePushState Example/title 
script language=javascript
Using Turbolinks 
# Turbolinks makes following links in your web application faster. 
# Read more: https://github.com/rails/turbolinks 
gem 'turbolinks' 
Gemfile 
//= require turbolinks 
app/assets/javascripts/applications.js
Turbolinks 
To disable Turbolinks for certain links 
a href=... data-no-turbolinksNo turbo links here/a. 
using data-no-turbolinks attribute
Turbolinks 
Troubleshooting 
$(document).ready - 
alert page has loaded! 
# This event will not work because of Turbolinks 
$(document).on page:change, - 
alert page has loaded! 
# This will work!
Turbolinks 
Demo
Thank you

More Related Content

What's hot (20)

Angular directive filter and routing
Angular directive filter and routingAngular directive filter and routing
Angular directive filter and routing
jagriti srivastava
 
Count to 10 and Say Yes
Count to 10 and Say YesCount to 10 and Say Yes
Count to 10 and Say Yes
John Henry Donovan
 
CFUGbe talk about Angular JS
CFUGbe talk about Angular JSCFUGbe talk about Angular JS
CFUGbe talk about Angular JS
Alwyn Wymeersch
 
Javascript validating form
Javascript validating formJavascript validating form
Javascript validating form
Jesus Obenita Jr.
 
Dart and AngularDart
Dart and AngularDartDart and AngularDart
Dart and AngularDart
Loc Nguyen
 
Django Admin: Widgetry & Witchery
Django Admin: Widgetry & WitcheryDjango Admin: Widgetry & Witchery
Django Admin: Widgetry & Witchery
Pamela Fox
 
Modules and injector
Modules and injectorModules and injector
Modules and injector
Eyal Vardi
 
Emberjs as a rails_developer
Emberjs as a rails_developer Emberjs as a rails_developer
Emberjs as a rails_developer
Sameera Gayan
 
Building a dashboard using AngularJS
Building a dashboard using AngularJSBuilding a dashboard using AngularJS
Building a dashboard using AngularJS
RajthilakMCA
 
jQuery Performance Rules
jQuery Performance RulesjQuery Performance Rules
jQuery Performance Rules
nagarajhubli
 
Oleksandr Masovets. Forms in Drupal. Drupal Camp Kyiv 2011
Oleksandr Masovets. Forms in Drupal. Drupal Camp Kyiv 2011Oleksandr Masovets. Forms in Drupal. Drupal Camp Kyiv 2011
Oleksandr Masovets. Forms in Drupal. Drupal Camp Kyiv 2011
Vlad Savitsky
 
Angular 2 Architecture (Bucharest 26/10/2016)
Angular 2 Architecture (Bucharest 26/10/2016)Angular 2 Architecture (Bucharest 26/10/2016)
Angular 2 Architecture (Bucharest 26/10/2016)
Eyal Vardi
 
DJango admin interface
DJango admin interfaceDJango admin interface
DJango admin interface
Mahesh Shitole
 
symfony & jQuery (phpDay)
symfony & jQuery (phpDay)symfony & jQuery (phpDay)
symfony & jQuery (phpDay)
Massimiliano Arione
 
Validation using javascripts by karan chanana
Validation using javascripts by karan chananaValidation using javascripts by karan chanana
Validation using javascripts by karan chanana
karan info
 
Jsp config implicit object
Jsp config implicit objectJsp config implicit object
Jsp config implicit object
chauhankapil
 
AngularJS in 60ish Minutes
AngularJS in 60ish MinutesAngularJS in 60ish Minutes
AngularJS in 60ish Minutes
Dan Wahlin
 
ActiveResource & REST
ActiveResource & RESTActiveResource & REST
ActiveResource & REST
Robbert
 
WordCamp Geneva Presentation - Customising WordPress' Admin Panel - 19 Nov. 2016
WordCamp Geneva Presentation - Customising WordPress' Admin Panel - 19 Nov. 2016WordCamp Geneva Presentation - Customising WordPress' Admin Panel - 19 Nov. 2016
WordCamp Geneva Presentation - Customising WordPress' Admin Panel - 19 Nov. 2016
Jesper van Engelen
 
Jquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript BasicsJquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript Basics
EPAM Systems
 
Angular directive filter and routing
Angular directive filter and routingAngular directive filter and routing
Angular directive filter and routing
jagriti srivastava
 
CFUGbe talk about Angular JS
CFUGbe talk about Angular JSCFUGbe talk about Angular JS
CFUGbe talk about Angular JS
Alwyn Wymeersch
 
Dart and AngularDart
Dart and AngularDartDart and AngularDart
Dart and AngularDart
Loc Nguyen
 
Django Admin: Widgetry & Witchery
Django Admin: Widgetry & WitcheryDjango Admin: Widgetry & Witchery
Django Admin: Widgetry & Witchery
Pamela Fox
 
Modules and injector
Modules and injectorModules and injector
Modules and injector
Eyal Vardi
 
Emberjs as a rails_developer
Emberjs as a rails_developer Emberjs as a rails_developer
Emberjs as a rails_developer
Sameera Gayan
 
Building a dashboard using AngularJS
Building a dashboard using AngularJSBuilding a dashboard using AngularJS
Building a dashboard using AngularJS
RajthilakMCA
 
jQuery Performance Rules
jQuery Performance RulesjQuery Performance Rules
jQuery Performance Rules
nagarajhubli
 
Oleksandr Masovets. Forms in Drupal. Drupal Camp Kyiv 2011
Oleksandr Masovets. Forms in Drupal. Drupal Camp Kyiv 2011Oleksandr Masovets. Forms in Drupal. Drupal Camp Kyiv 2011
Oleksandr Masovets. Forms in Drupal. Drupal Camp Kyiv 2011
Vlad Savitsky
 
Angular 2 Architecture (Bucharest 26/10/2016)
Angular 2 Architecture (Bucharest 26/10/2016)Angular 2 Architecture (Bucharest 26/10/2016)
Angular 2 Architecture (Bucharest 26/10/2016)
Eyal Vardi
 
DJango admin interface
DJango admin interfaceDJango admin interface
DJango admin interface
Mahesh Shitole
 
Validation using javascripts by karan chanana
Validation using javascripts by karan chananaValidation using javascripts by karan chanana
Validation using javascripts by karan chanana
karan info
 
Jsp config implicit object
Jsp config implicit objectJsp config implicit object
Jsp config implicit object
chauhankapil
 
AngularJS in 60ish Minutes
AngularJS in 60ish MinutesAngularJS in 60ish Minutes
AngularJS in 60ish Minutes
Dan Wahlin
 
ActiveResource & REST
ActiveResource & RESTActiveResource & REST
ActiveResource & REST
Robbert
 
WordCamp Geneva Presentation - Customising WordPress' Admin Panel - 19 Nov. 2016
WordCamp Geneva Presentation - Customising WordPress' Admin Panel - 19 Nov. 2016WordCamp Geneva Presentation - Customising WordPress' Admin Panel - 19 Nov. 2016
WordCamp Geneva Presentation - Customising WordPress' Admin Panel - 19 Nov. 2016
Jesper van Engelen
 
Jquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript BasicsJquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript Basics
EPAM Systems
 

Similar to Working with Javascript in Rails (20)

jQuery Presentation to Rails Developers
jQuery Presentation to Rails DevelopersjQuery Presentation to Rails Developers
jQuery Presentation to Rails Developers
Yehuda Katz
 
Devdays Seattle jQuery Intro for Developers
Devdays Seattle jQuery Intro for DevelopersDevdays Seattle jQuery Intro for Developers
Devdays Seattle jQuery Intro for Developers
cody lindley
 
Rails is not just Ruby
Rails is not just RubyRails is not just Ruby
Rails is not just Ruby
Marco Otte-Witte
 
Write Less Do More
Write Less Do MoreWrite Less Do More
Write Less Do More
Remy Sharp
 
Cleaner, Leaner, Meaner: Refactoring your jQuery
Cleaner, Leaner, Meaner: Refactoring your jQueryCleaner, Leaner, Meaner: Refactoring your jQuery
Cleaner, Leaner, Meaner: Refactoring your jQuery
Rebecca Murphey
 
jQuery and Rails, Sitting in a Tree
jQuery and Rails, Sitting in a TreejQuery and Rails, Sitting in a Tree
jQuery and Rails, Sitting in a Tree
adamlogic
 
Ajax Rails
Ajax RailsAjax Rails
Ajax Rails
hot
 
Unobtrusive JavaScript
Unobtrusive JavaScriptUnobtrusive JavaScript
Unobtrusive JavaScript
Vitaly Baum
 
Week 4 - jQuery + Ajax
Week 4 - jQuery + AjaxWeek 4 - jQuery + Ajax
Week 4 - jQuery + Ajax
baygross
 
Stack Overflow Austin - jQuery for Developers
Stack Overflow Austin - jQuery for DevelopersStack Overflow Austin - jQuery for Developers
Stack Overflow Austin - jQuery for Developers
Jonathan Sharp
 
Rails Concerns and Turbolinks
Rails Concerns and TurbolinksRails Concerns and Turbolinks
Rails Concerns and Turbolinks
Nascenia IT
 
Jquery In Rails
Jquery In RailsJquery In Rails
Jquery In Rails
shen liu
 
NinjaScript 2010-10-14
NinjaScript 2010-10-14NinjaScript 2010-10-14
NinjaScript 2010-10-14
lrdesign
 
Microsoft PowerPoint - <b>jQuery</b>-1-Ajax.pptx
Microsoft PowerPoint - <b>jQuery</b>-1-Ajax.pptxMicrosoft PowerPoint - <b>jQuery</b>-1-Ajax.pptx
Microsoft PowerPoint - <b>jQuery</b>-1-Ajax.pptx
tutorialsruby
 
jQuery-1-Ajax
jQuery-1-AjaxjQuery-1-Ajax
jQuery-1-Ajax
guestcf600a
 
jQuery-1-Ajax
jQuery-1-AjaxjQuery-1-Ajax
jQuery-1-Ajax
guestcf600a
 
<img src="../i/r_14.png" />
<img src="../i/r_14.png" /><img src="../i/r_14.png" />
<img src="../i/r_14.png" />
tutorialsruby
 
Eugene Andruszczenko: jQuery
Eugene Andruszczenko: jQueryEugene Andruszczenko: jQuery
Eugene Andruszczenko: jQuery
Refresh Events
 
jQuery Presentation - Refresh Events
jQuery Presentation - Refresh EventsjQuery Presentation - Refresh Events
jQuery Presentation - Refresh Events
Eugene Andruszczenko
 
UJS in Rails 3
UJS in Rails 3UJS in Rails 3
UJS in Rails 3
philcrissman
 
jQuery Presentation to Rails Developers
jQuery Presentation to Rails DevelopersjQuery Presentation to Rails Developers
jQuery Presentation to Rails Developers
Yehuda Katz
 
Devdays Seattle jQuery Intro for Developers
Devdays Seattle jQuery Intro for DevelopersDevdays Seattle jQuery Intro for Developers
Devdays Seattle jQuery Intro for Developers
cody lindley
 
Write Less Do More
Write Less Do MoreWrite Less Do More
Write Less Do More
Remy Sharp
 
Cleaner, Leaner, Meaner: Refactoring your jQuery
Cleaner, Leaner, Meaner: Refactoring your jQueryCleaner, Leaner, Meaner: Refactoring your jQuery
Cleaner, Leaner, Meaner: Refactoring your jQuery
Rebecca Murphey
 
jQuery and Rails, Sitting in a Tree
jQuery and Rails, Sitting in a TreejQuery and Rails, Sitting in a Tree
jQuery and Rails, Sitting in a Tree
adamlogic
 
Ajax Rails
Ajax RailsAjax Rails
Ajax Rails
hot
 
Unobtrusive JavaScript
Unobtrusive JavaScriptUnobtrusive JavaScript
Unobtrusive JavaScript
Vitaly Baum
 
Week 4 - jQuery + Ajax
Week 4 - jQuery + AjaxWeek 4 - jQuery + Ajax
Week 4 - jQuery + Ajax
baygross
 
Stack Overflow Austin - jQuery for Developers
Stack Overflow Austin - jQuery for DevelopersStack Overflow Austin - jQuery for Developers
Stack Overflow Austin - jQuery for Developers
Jonathan Sharp
 
Rails Concerns and Turbolinks
Rails Concerns and TurbolinksRails Concerns and Turbolinks
Rails Concerns and Turbolinks
Nascenia IT
 
Jquery In Rails
Jquery In RailsJquery In Rails
Jquery In Rails
shen liu
 
NinjaScript 2010-10-14
NinjaScript 2010-10-14NinjaScript 2010-10-14
NinjaScript 2010-10-14
lrdesign
 
Microsoft PowerPoint - <b>jQuery</b>-1-Ajax.pptx
Microsoft PowerPoint - <b>jQuery</b>-1-Ajax.pptxMicrosoft PowerPoint - <b>jQuery</b>-1-Ajax.pptx
Microsoft PowerPoint - <b>jQuery</b>-1-Ajax.pptx
tutorialsruby
 
<img src="../i/r_14.png" />
<img src="../i/r_14.png" /><img src="../i/r_14.png" />
<img src="../i/r_14.png" />
tutorialsruby
 
Eugene Andruszczenko: jQuery
Eugene Andruszczenko: jQueryEugene Andruszczenko: jQuery
Eugene Andruszczenko: jQuery
Refresh Events
 
jQuery Presentation - Refresh Events
jQuery Presentation - Refresh EventsjQuery Presentation - Refresh Events
jQuery Presentation - Refresh Events
Eugene Andruszczenko
 
Ad

Recently uploaded (20)

Oracle Cloud Infrastructure AI Foundations
Oracle Cloud Infrastructure AI FoundationsOracle Cloud Infrastructure AI Foundations
Oracle Cloud Infrastructure AI Foundations
VICTOR MAESTRE RAMIREZ
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
Ivanti
 
Agentic AI: Beyond the Buzz- LangGraph Studio V2
Agentic AI: Beyond the Buzz- LangGraph Studio V2Agentic AI: Beyond the Buzz- LangGraph Studio V2
Agentic AI: Beyond the Buzz- LangGraph Studio V2
Shashikant Jagtap
 
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
 
Edge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdfEdge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdf
AmirStern2
 
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy SurveyTrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc
 
Enabling BIM / GIS integrations with Other Systems with FME
Enabling BIM / GIS integrations with Other Systems with FMEEnabling BIM / GIS integrations with Other Systems with FME
Enabling BIM / GIS integrations with Other Systems with FME
Safe Software
 
Oracle Cloud Infrastructure Generative AI Professional
Oracle Cloud Infrastructure Generative AI ProfessionalOracle Cloud Infrastructure Generative AI Professional
Oracle Cloud Infrastructure Generative AI Professional
VICTOR MAESTRE RAMIREZ
 
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdfENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
Muhammad Rizwan Akram
 
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven InfrastructureNo-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
Safe Software
 
vertical-cnc-processing-centers-drillteq-v-200-en.pdf
vertical-cnc-processing-centers-drillteq-v-200-en.pdfvertical-cnc-processing-centers-drillteq-v-200-en.pdf
vertical-cnc-processing-centers-drillteq-v-200-en.pdf
AmirStern2
 
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
Safe Software
 
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdfCrypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
 
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
Edge AI and Vision Alliance
 
Data Validation and System Interoperability
Data Validation and System InteroperabilityData Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
Edge AI and Vision Alliance
 
Providing an OGC API Processes REST Interface for FME Flow
Providing an OGC API Processes REST Interface for FME FlowProviding an OGC API Processes REST Interface for FME Flow
Providing an OGC API Processes REST Interface for FME Flow
Safe Software
 
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API CatalogMuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
 
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptxFIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Alliance
 
Oracle Cloud Infrastructure AI Foundations
Oracle Cloud Infrastructure AI FoundationsOracle Cloud Infrastructure AI Foundations
Oracle Cloud Infrastructure AI Foundations
VICTOR MAESTRE RAMIREZ
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
Ivanti
 
Agentic AI: Beyond the Buzz- LangGraph Studio V2
Agentic AI: Beyond the Buzz- LangGraph Studio V2Agentic AI: Beyond the Buzz- LangGraph Studio V2
Agentic AI: Beyond the Buzz- LangGraph Studio V2
Shashikant Jagtap
 
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
 
Edge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdfEdge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdf
AmirStern2
 
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy SurveyTrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc
 
Enabling BIM / GIS integrations with Other Systems with FME
Enabling BIM / GIS integrations with Other Systems with FMEEnabling BIM / GIS integrations with Other Systems with FME
Enabling BIM / GIS integrations with Other Systems with FME
Safe Software
 
Oracle Cloud Infrastructure Generative AI Professional
Oracle Cloud Infrastructure Generative AI ProfessionalOracle Cloud Infrastructure Generative AI Professional
Oracle Cloud Infrastructure Generative AI Professional
VICTOR MAESTRE RAMIREZ
 
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdfENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
Muhammad Rizwan Akram
 
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven InfrastructureNo-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
Safe Software
 
vertical-cnc-processing-centers-drillteq-v-200-en.pdf
vertical-cnc-processing-centers-drillteq-v-200-en.pdfvertical-cnc-processing-centers-drillteq-v-200-en.pdf
vertical-cnc-processing-centers-drillteq-v-200-en.pdf
AmirStern2
 
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
Safe Software
 
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdfCrypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
 
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
Edge AI and Vision Alliance
 
Data Validation and System Interoperability
Data Validation and System InteroperabilityData Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
Edge AI and Vision Alliance
 
Providing an OGC API Processes REST Interface for FME Flow
Providing an OGC API Processes REST Interface for FME FlowProviding an OGC API Processes REST Interface for FME Flow
Providing an OGC API Processes REST Interface for FME Flow
Safe Software
 
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API CatalogMuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
 
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptxFIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Alliance
 
Ad

Working with Javascript in Rails

  • 1. - ROR Lab. Season 3 - 70 Biweekly Lecture Working with Javascript in Rails 2014-09-16 SeungKyun Nam
  • 2. Agenda Ajax: Introduction Unobtrusive Javascript Built-in Helpers Ajax: Server-Side Concerns Turbolinks
  • 3. Ajax: Introduction What is Ajax: Asynchronous Javascript and XML
  • 4. Ajax: Introduction The origin of the term called 'Ajax' by Adaptive Path Blog post: Ajax: but ... A New Approach to Web Applications
  • 5. Ajax: Introduction Understanding Request-Response Cycle
  • 6. Ajax: Introduction Classic Model vs AJax Model
  • 7. Ajax: Introduction Synchronous Model vs Asynchronous Model
  • 8. Ajax: Introduction Defining Ajax Presentation: XHTML and CSS - HTML5 and CSS3 Document Object Model Data: XML and XSLT - (mostly JSON) Carrier: XMLHttpRequest Binding everything together: Javascript
  • 9. Ajax: Introduction Sample Code // COFFEESCRIPT $.ajax(url: /test/lorem).done (html) - $(#results).append html // Generated JAVASCRIPT (function() { $.ajax({ url: /test/lorem }).done(function(html) { return $(#results).append(html); }); }).call(this);
  • 11. Unobtrusive Javascript Three main goals To separate JavaScript from HTML markup, as well as keeping modules of JavaScript independent of other modules. Unobtrusive JavaScript should degrade gracefully - all content should be available without all or any of the JavaScript running successfully. Unobtrusive JavaScript should not degrade the accessibility of the HTML, and ideally should improve it, whether the user has personal disabilities or are using an unusual, or unusually configured, browser.
  • 12. Tip: To complie CoffeeScript without top-level function safety wrapper # Compile the Javascript without the top-level function safety wrapper # CoffeeScript Option -b or --bare Tilt::CoffeeScriptTemplate.default_bare = true config/environment.rb
  • 13. Traditional Way Inline Javascript a href=# onclick=this.style.backgroundColor='#009900';this.style.color='#FFFFFF' Paint it green /a
  • 14. Traditional (Better) Way Using Functions paintIt = (element, backgroundColor, textColor) - element.style.backgroundColor = backgroundColor if textColor? element.style.color = textColor a href=# onclick=paintIt(this, '#990000')Paint it red/a a href=# onclick=paintIt(this, '#009900', '#FFFFFF')Paint it green/a
  • 15. Unobtrusive Way paintIt = (element, backgroundColor, textColor) - element.style.backgroundColor = backgroundColor if textColor? element.style.color = textColor $ - $(a[data-background-color]).click - backgroundColor = $(this).data(background-color) textColor = $(this).data[text-color] paintIt(this, backgroundColor, textColor) a href=# data-background-color=#990000Paint it red/a a href=# data-background-color=#009900 data-text-color=#FFFFFFPaint it green/a a href=# data-background-color=#000099 data-text-color=#FFFFFFPaint it blue/a
  • 17. Built-in Helpers Rails Ajax helpers are in two parts Javascript half - rails.js Ruby half - add appropriate tags to DOM
  • 18. form_for %= form_for(@post, remote: true) do |f| % ... % end % !-- Generated HTML -- form accept-charset=UTF-8 action=/posts class=new_post data-remote=true id=new_post method=post ... /form
  • 19. form_for Adding Ajax Event $(document).ready - $(#new_post).on(ajax:success), (e, data, status, xhr) - $(#new_post).append xhr.responseText ).bind ajax:error, (e, data, status, error) - $(#new_post).append pERROR/p
  • 21. link_to %= link_to a post, @post, remote: true % !-- Generated HTML -- a href=/https/www.slideshare.net/posts/1 data-remote=truea post/a
  • 22. link_to Adding Ajax Event %= link_to Delete Post, @post, remote: true, method: :delete % $ - $(a[data-remote]).on ajax:success, (e, data, status, xhr) - alert The post was deleted.
  • 23. button_to %= button_to A post, @post, remote: true % !-- Generated HTML -- form action=/posts/1 class=button_to data-remote=true method=post divinput type=submit value=A post/div /form
  • 26. Server-Side Concerns by Example class UsersController ApplicationController def index @users = User.all @user = User.new end # ... end bUsers/b ul id=users li /li /ul br br app/views/users/index.html.erb app/controllers/users_controller.rb li /li app/views/users/_user.html.erb
  • 27. Server-Side Concerns by Example # ... def create @user = User.new(params[:user]) respond_to do |format| if @user.save format.html { redirect_to @user, notice: 'User was successfully created.' } format.js {} format.json { render json: @user, status: :created, location: @user } else format.html { render action: new } format.json { render json: @user.errors, status: :unprocessable_entity } end end end # ... app/controllers/users_controller.rb
  • 28. Server-Side Concerns by Example $(%= escape_javascript(render @user) %).appendTo(#users) app/views/users/create.js.erb
  • 30. Turbolinks Rails 4 Default Turbolinks Gem Uses Ajax to speed up page rendering PushState
  • 31. Turbolinks How it works attaches a click handler to all a tags check if browser supports PushState if so, make an Ajax request parse the response replace the entire body change the URL using PushState
  • 32. PushState a part of HTML5 History-API !doctype html html head titlePushState Example/title script language=javascript
  • 33. Using Turbolinks # Turbolinks makes following links in your web application faster. # Read more: https://github.com/rails/turbolinks gem 'turbolinks' Gemfile //= require turbolinks app/assets/javascripts/applications.js
  • 34. Turbolinks To disable Turbolinks for certain links a href=... data-no-turbolinksNo turbo links here/a. using data-no-turbolinks attribute
  • 35. Turbolinks Troubleshooting $(document).ready - alert page has loaded! # This event will not work because of Turbolinks $(document).on page:change, - alert page has loaded! # This will work!