SlideShare a Scribd company logo
1 of 34
Download to read offline
Alex Gaziev’s
GEM GON
@gazay (github, twitter)
Saturday, June 8, 13
Saturday, June 8, 13
SURFING
JAZZ
OSS
:russia => ‘BALI’
Saturday, June 8, 13
Some of my works
gon
talks
gon-sinatra
tonik
is
hockeypuck
...
Saturday, June 8, 13
A little about GON
Send data from action to JS
Started 2 years ago
~800 stars
50+ forks and PRs
Saturday, June 8, 13
Data to JS:
data-attribute
Instance variable in controller
Data-attribute in view
Find tag and parse data attribute
Saturday, June 8, 13
Data to JS:
data-attr example
controller
# home_controller.rb
def index
# some logic
@products = counted_products_collection
end
Saturday, June 8, 13
Data to JS:
data-attr example
view
# views/home/index.html.erb
... some content
<%= contant_tag “div”, id: “products”, data:
{ products: @products } do %>
Loading products...
<% end %>
Saturday, June 8, 13
Data to JS:
data-attr example
JS
# assets/javascripts/pages/home.js.coffee
jQuery ->
doSomething $(‘#products’).data(‘products’)
Saturday, June 8, 13
Data to JS:
javascript_tag
Excess lines inside your views
You should think what you write
Saturday, June 8, 13
Data to JS:
javascript_tag
view
# views/home/index.html.erb
... some content
<%= javascript_tag do %>
window.prodsURL = “<%=j products_url %>”
window.prods = <%=raw @prods.to_json %>
<% end %>
Saturday, June 8, 13
Data to JS:
javascript_tag
JS
# assets/javascripts/pages/home.js.coffee
jQuery ->
doSomething prods
Saturday, June 8, 13
Saturday, June 8, 13
Data to JS
GON
Views step - once (perfect - in layout)
Don’t have to think about escaping
Stored uniq data per request
Saturday, June 8, 13
Data to JS:
GON example
controller
# home_controller.rb
def index
# some logic
gon.products = counted_collection
gon.products_url = products_url
end
Saturday, June 8, 13
Data to JS:
GON example
view
# views/layouts/layout.html.erb
<head>
<%= include_gon(options) %>
... your js, css etc
Saturday, June 8, 13
Data to JS:
GON example
JS
# assets/javascripts/pages/home.js.coffee
jQuery ->
doSomething gon.products
Saturday, June 8, 13
Usual ways: cons
Escaping ( “</script><script>evil()</
script>”)
Excess lines in your views
Search for tag and parse attributes
Views step
Saturday, June 8, 13
GON: pros
Automatically escape and transform
to_json all data
What you write in action – you’ll get in JS
Should modify views once
Saturday, June 8, 13
GON. Next versions
Generate json with template engines
Share data between requests
Renew data in JS gon easy way
Saturday, June 8, 13
GON
RABL and jBuilder
Success!
Screencast
Ruby Weekly
More users => more PRs
Saturday, June 8, 13
GON, RABL and
jBuilder
why so cool?
All power of RABL and jBuilder
Clean your controller new way
Render multiple templates with GON
Saturday, June 8, 13
GON and RABL
multi templates
# home_controller.rb
def index
gon.rabl ‘path_to_temlpate1’, as: ‘posts’
gon.rabl ‘path_to_template2’, as: ‘users’
gon.rabl ‘path_to_template3’, as: ‘admins’
gon.rabl # app/views/home/index.rabl
end
Saturday, June 8, 13
GON and jBuilder
problems
jBuilder rendering flow
Metaprogramming
Whole environment for eval
Saturday, June 8, 13
Saturday, June 8, 13
GON Global
Share data application-wide
Initial data
Change settings everywhere by event
Saturday, June 8, 13
GON Global
init data example
# config/initializers/gon.rb
Gon.global.pictures_per_user = 4
# app/assets/javascripts/imageboard.js.coffee
setLimitToUser = gon.global.pictures_per_request
Saturday, June 8, 13
GON Global
change data example
# app/model/user.rb
after_save :change_users_limit
def change_users_limit
if User.count > 1000
Gon.global.pictures_per_request = 3
end
end
Saturday, June 8, 13
GON watch
Renew data for variable
No excess LOC
Use current state of action
Saturday, June 8, 13
GON watch:
how it works
# home_controller.rb
def index
num = User.count * factor + params[:some].to_i
gon.watch.pictures_per_request = num
gon.watch.other_num = num * factor2
end
Saturday, June 8, 13
GON watch:
how it works
# layout.html.erb
<head>
<%= include_gon(watch: true) %>
...
Saturday, June 8, 13
GON watch:
how it works
# home_index.js.coffee
renewLimit = (count) ->
$(‘#limit-counter’).text(count)
gon.watch(‘pictures_per_request’, interval: 1000,
renewLimit)
Saturday, June 8, 13
GON watch
example
Saturday, June 8, 13
Thank you!
Any questions?
http://github.com/gazay/gon
Saturday, June 8, 13

More Related Content

Similar to Gon gem. For RDRC 2013, June 7

Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
Andy Peterson
 
A Better UJS for Rails
A Better UJS for RailsA Better UJS for Rails
A Better UJS for Rails
Zack Siri
 
Intro to React - Featuring Modern JavaScript
Intro to React - Featuring Modern JavaScriptIntro to React - Featuring Modern JavaScript
Intro to React - Featuring Modern JavaScript
jasonsich
 

Similar to Gon gem. For RDRC 2013, June 7 (20)

Использование Debug утилит в разработке под Android
Использование Debug утилит в разработке под AndroidИспользование Debug утилит в разработке под Android
Использование Debug утилит в разработке под Android
 
Tek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJSTek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJS
 
Intro to Backbone.js by Azat Mardanov for General Assembly
Intro to Backbone.js by Azat Mardanov for General AssemblyIntro to Backbone.js by Azat Mardanov for General Assembly
Intro to Backbone.js by Azat Mardanov for General Assembly
 
Boost Development With Java EE7 On EAP7 (Demitris Andreadis)
Boost Development With Java EE7 On EAP7 (Demitris Andreadis)Boost Development With Java EE7 On EAP7 (Demitris Andreadis)
Boost Development With Java EE7 On EAP7 (Demitris Andreadis)
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
 
Oredev 2013: Building Web Apps with Ember.js
Oredev 2013: Building Web Apps with Ember.jsOredev 2013: Building Web Apps with Ember.js
Oredev 2013: Building Web Apps with Ember.js
 
UberFire Quick Intro and Overview (early beta Aug 2013)
UberFire Quick Intro and Overview (early beta Aug 2013)UberFire Quick Intro and Overview (early beta Aug 2013)
UberFire Quick Intro and Overview (early beta Aug 2013)
 
jQuery Mobile Deep Dive
jQuery Mobile Deep DivejQuery Mobile Deep Dive
jQuery Mobile Deep Dive
 
Einführung in AngularJS
Einführung in AngularJSEinführung in AngularJS
Einführung in AngularJS
 
Slides
SlidesSlides
Slides
 
Phplx mongodb
Phplx mongodbPhplx mongodb
Phplx mongodb
 
A Better UJS for Rails
A Better UJS for RailsA Better UJS for Rails
A Better UJS for Rails
 
RequireJS
RequireJSRequireJS
RequireJS
 
Performance and Optmization - a technical talk at Frontend London
Performance and Optmization - a technical talk at Frontend LondonPerformance and Optmization - a technical talk at Frontend London
Performance and Optmization - a technical talk at Frontend London
 
Intro to Ember.js
Intro to Ember.jsIntro to Ember.js
Intro to Ember.js
 
Intro to React - Featuring Modern JavaScript
Intro to React - Featuring Modern JavaScriptIntro to React - Featuring Modern JavaScript
Intro to React - Featuring Modern JavaScript
 
Dive into AngularJS and directives
Dive into AngularJS and directivesDive into AngularJS and directives
Dive into AngularJS and directives
 
Passing a Front end Developer interview
Passing a Front end Developer interview Passing a Front end Developer interview
Passing a Front end Developer interview
 
What is this DI and AOP stuff anyway...
What is this DI and AOP stuff anyway...What is this DI and AOP stuff anyway...
What is this DI and AOP stuff anyway...
 
Data visualization in python/Django
Data visualization in python/DjangoData visualization in python/Django
Data visualization in python/Django
 

Recently uploaded

Recently uploaded (20)

Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 

Gon gem. For RDRC 2013, June 7

  • 1. Alex Gaziev’s GEM GON @gazay (github, twitter) Saturday, June 8, 13
  • 4. Some of my works gon talks gon-sinatra tonik is hockeypuck ... Saturday, June 8, 13
  • 5. A little about GON Send data from action to JS Started 2 years ago ~800 stars 50+ forks and PRs Saturday, June 8, 13
  • 6. Data to JS: data-attribute Instance variable in controller Data-attribute in view Find tag and parse data attribute Saturday, June 8, 13
  • 7. Data to JS: data-attr example controller # home_controller.rb def index # some logic @products = counted_products_collection end Saturday, June 8, 13
  • 8. Data to JS: data-attr example view # views/home/index.html.erb ... some content <%= contant_tag “div”, id: “products”, data: { products: @products } do %> Loading products... <% end %> Saturday, June 8, 13
  • 9. Data to JS: data-attr example JS # assets/javascripts/pages/home.js.coffee jQuery -> doSomething $(‘#products’).data(‘products’) Saturday, June 8, 13
  • 10. Data to JS: javascript_tag Excess lines inside your views You should think what you write Saturday, June 8, 13
  • 11. Data to JS: javascript_tag view # views/home/index.html.erb ... some content <%= javascript_tag do %> window.prodsURL = “<%=j products_url %>” window.prods = <%=raw @prods.to_json %> <% end %> Saturday, June 8, 13
  • 12. Data to JS: javascript_tag JS # assets/javascripts/pages/home.js.coffee jQuery -> doSomething prods Saturday, June 8, 13
  • 14. Data to JS GON Views step - once (perfect - in layout) Don’t have to think about escaping Stored uniq data per request Saturday, June 8, 13
  • 15. Data to JS: GON example controller # home_controller.rb def index # some logic gon.products = counted_collection gon.products_url = products_url end Saturday, June 8, 13
  • 16. Data to JS: GON example view # views/layouts/layout.html.erb <head> <%= include_gon(options) %> ... your js, css etc Saturday, June 8, 13
  • 17. Data to JS: GON example JS # assets/javascripts/pages/home.js.coffee jQuery -> doSomething gon.products Saturday, June 8, 13
  • 18. Usual ways: cons Escaping ( “</script><script>evil()</ script>”) Excess lines in your views Search for tag and parse attributes Views step Saturday, June 8, 13
  • 19. GON: pros Automatically escape and transform to_json all data What you write in action – you’ll get in JS Should modify views once Saturday, June 8, 13
  • 20. GON. Next versions Generate json with template engines Share data between requests Renew data in JS gon easy way Saturday, June 8, 13
  • 21. GON RABL and jBuilder Success! Screencast Ruby Weekly More users => more PRs Saturday, June 8, 13
  • 22. GON, RABL and jBuilder why so cool? All power of RABL and jBuilder Clean your controller new way Render multiple templates with GON Saturday, June 8, 13
  • 23. GON and RABL multi templates # home_controller.rb def index gon.rabl ‘path_to_temlpate1’, as: ‘posts’ gon.rabl ‘path_to_template2’, as: ‘users’ gon.rabl ‘path_to_template3’, as: ‘admins’ gon.rabl # app/views/home/index.rabl end Saturday, June 8, 13
  • 24. GON and jBuilder problems jBuilder rendering flow Metaprogramming Whole environment for eval Saturday, June 8, 13
  • 26. GON Global Share data application-wide Initial data Change settings everywhere by event Saturday, June 8, 13
  • 27. GON Global init data example # config/initializers/gon.rb Gon.global.pictures_per_user = 4 # app/assets/javascripts/imageboard.js.coffee setLimitToUser = gon.global.pictures_per_request Saturday, June 8, 13
  • 28. GON Global change data example # app/model/user.rb after_save :change_users_limit def change_users_limit if User.count > 1000 Gon.global.pictures_per_request = 3 end end Saturday, June 8, 13
  • 29. GON watch Renew data for variable No excess LOC Use current state of action Saturday, June 8, 13
  • 30. GON watch: how it works # home_controller.rb def index num = User.count * factor + params[:some].to_i gon.watch.pictures_per_request = num gon.watch.other_num = num * factor2 end Saturday, June 8, 13
  • 31. GON watch: how it works # layout.html.erb <head> <%= include_gon(watch: true) %> ... Saturday, June 8, 13
  • 32. GON watch: how it works # home_index.js.coffee renewLimit = (count) -> $(‘#limit-counter’).text(count) gon.watch(‘pictures_per_request’, interval: 1000, renewLimit) Saturday, June 8, 13