SlideShare una empresa de Scribd logo
1 de 34
Descargar para leer sin conexión
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

Más contenido relacionado

Similar a 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 a 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
 

Último

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 

Último (20)

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...
 
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
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
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
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
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...
 
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
 
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
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
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)
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 

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