====== Ajaxification App - Rails ======
==== ajaxify-rails Gem ====
From https://github.com/ncri/ajaxify_rails
Automatically makes your app load content in the background via ajax.
It works by turning all internal links into Ajax links that trigger an update of the page’s content area.
Form submissions are also turned into ajax requests.
=== Usage ===
Add this to gem file
gem 'ajaxify_rails'
Run bundle install
Call Ajaxify.init() in dom:loaded.
By default, the content is updated inside a element with id “main”. This can be customizable by setting “content_container” to the id of the element which is to be updated on ajaxified request.
In our app “ajaxify_div” is the **content_container**.
**Page title** is supported by default.
**Loader** can be customizable with our own css to the element “ajaxify_loader”.
Also loader is optional and it can be disabled by setting “display_loader” to false while initializing or by setting classes “display_loader” or “no_display_loader”
**Flash messages** are supported by default.
If flash message of types other than ‘notice’ is used then it should be specified as “flash_types” while initializing.
=== Events ===
**before_load**
Any updates to be done before sending the request can be done in “before_load” event.
In our case we load controller specific assets for ajaxified requests on “before_load” event.
**content_loaded**
Any updates to be made after the content is loaded can be done in “content_loaded” event.
In our app we update the notification count and set the navigation links color in “content_loaded” event.
**flash_displayed**
This event is triggered after a flash message is displayed.
This accepts flash_type as parameter.
In our app we slide up the flash message for ajaxified requests inside “flash_displayed” event.
**Other events**
There are other events such as content_inserted and load_error which we dont use in our app currently.
=== Other Features ===
**Scrolling**
Ajaxify scrolls to the top on every request.
This can be turned off by setting “scroll_to_top” to false while initializing.
Scrolling of individual links can also be turned off or on by setting class “scroll_to_top” or “no_scroll_to_top”
=== Turn off and turn on ajaxification ===
Ajaxification can be temporarily turned off for some pages using Ajaxify.activate(false) and can be turned on using Ajaxify.activate() (This needs to be called before dom ready.
Also you can set the “active” option to false while initializing.
=== Internal customization to suit our requirement. ===
Since we don’t need all the links to be ajaxified, we have customized the gem to ajaxify only the links with class “ajaxify”
The gem by default requires, flash type to be the id of the element which holds the flash message. We have customized it to have our own id.
===== Gom gem ====
==== Usage ====
Include this in gem file
gem 'gon'
Run bundle install
In Layout add
include_gon(:init => true)
In controller
gon.variable_name = value
In js use it
gon.variable_name
==== Where we need this in Performance? ====
1. We store the controller name for loading controller specific assets.
2. We store the activity count to update the notifications count on every ajaxified request.
3. Page title and sub page title to highlight the selected page/subpage link.
**Note** This needs to be initialized for every request so adding include_gon(:init => true) in ajaxify_application layout.
===== Horizontal Progress Bar (Youtube style progress bar) =====
==== Pace gem ====
http://github.hubspot.com/pace/
By default pace gem displays the progress bar for page load requests, ajax requests, ajaxified requests as well as for the elements which we can specify (default element is ‘body’ tag).
**Api’s**: start, restart, stop, track, ignore
**Events**: start, restart, stop, done, hide
=== Usage ===
In our app we show this kind of a loader only for ajaxified requests and for requests where we navigate through review cycles and for navigation inside review’s page.
So we disable pace loader for page load, ajax requests.
In layout
javascript_tag("window.paceOptions = { restartOnRequestAfter: false, startOnPageLoad: false, restartOnPushState: false }")
Pace for ajaxified requests begins on push state and since ajaxify rails takes some time to insert url using push state there exists a lag.
To avoid this lag we disable pace for ajaxified requests as well and manually call Pace.restart() in necessary places.
We do this generically for ajaxified requests by observing click on link’s and form’s with class “ajaxify”, inside which we call Pace.restart();
Other places, if we need to display this kind of progress bar call Pace.restart();