From 6fcba2dd4b9296928c9a8ee7ad1964387fd4f6ef Mon Sep 17 00:00:00 2001
From: Dennis Collinson <dennis.collective@gmail.com>
Date: Fri, 4 May 2012 15:17:32 -0700
Subject: [PATCH] preload javascript vars using gon

---
 Gemfile                                     |  1 +
 Gemfile.lock                                |  4 ++++
 app/assets/javascripts/app/app.js           | 13 +++++++++++
 app/assets/javascripts/app/models/stream.js | 15 +++++-------
 app/controllers/people_controller.rb        | 26 +++++++++++++++------
 app/views/layouts/post.html.haml            |  4 +++-
 spec/javascripts/app/pages/profile_spec.js  |  5 ++++
 7 files changed, 51 insertions(+), 17 deletions(-)

diff --git a/Gemfile b/Gemfile
index 378e6588a5..1c6e2fce9a 100644
--- a/Gemfile
+++ b/Gemfile
@@ -104,6 +104,7 @@ gem 'mobile-fu'
 
 gem 'will_paginate'
 gem 'client_side_validations'
+gem 'gon'
 
 # assets
 
diff --git a/Gemfile.lock b/Gemfile.lock
index e87b148a25..e632ce2f56 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -196,6 +196,9 @@ GEM
     gem_plugin (0.2.3)
     gherkin (2.9.3)
       json (>= 1.4.6)
+    gon (3.0.2)
+      actionpack (>= 2.3.0)
+      json
     guard (1.0.1)
       ffi (>= 0.5.0)
       thor (~> 0.14.6)
@@ -522,6 +525,7 @@ DEPENDENCIES
   foreigner (~> 1.1.0)
   foreman (= 0.41)
   fuubar (>= 1.0)
+  gon
   guard-cucumber
   guard-rspec
   guard-spork
diff --git a/app/assets/javascripts/app/app.js b/app/assets/javascripts/app/app.js
index abf2f8ff94..2991abf414 100644
--- a/app/assets/javascripts/app/app.js
+++ b/app/assets/javascripts/app/app.js
@@ -49,6 +49,19 @@ var app = {
       $(".stream_title").text(link.text())
       app.router.navigate(link.attr("href").substring(1) ,true)
     })
+  },
+
+  hasPreload : function(prop) {
+    return !!(window.preloads && window.preloads[prop]) //returning boolean variable so that parsePreloads, which cleans up properly is used instead
+  },
+
+  parsePreload : function(prop){
+      if(!app.hasPreload(prop)) { return }
+
+      var preload = window.preloads[prop]
+      delete window.preloads[prop] //prevent dirty state across navigates
+
+      return JSON.parse(preload)
   }
 };
 
diff --git a/app/assets/javascripts/app/models/stream.js b/app/assets/javascripts/app/models/stream.js
index a466b2d87b..37c4ef8dcc 100644
--- a/app/assets/javascripts/app/models/stream.js
+++ b/app/assets/javascripts/app/models/stream.js
@@ -61,20 +61,17 @@ app.models.Stream = Backbone.Collection.extend({
     this.items.add(models)
   },
 
+
   preloadOrFetch : function(){ //hai, plz test me THNX
-    this.preload()
-    if(this.items.length == 0) {
+    if(app.hasPreload("stream")){
+      this.preload()
+    } else {
       this.fetch()
     }
   },
 
   preload : function(){
-    var preloadJson = window.preLoadContent && JSON.parse(window.preLoadContent)
-    delete window.preLoadContent // always do this just to be safe in preventing dirty state across navigates
-
-    if(preloadJson) {
-      this.items.reset(preloadJson)
-      this.trigger("fetched")
-    }
+    this.items.reset(app.parsePreload("stream"))
+    this.trigger("fetched")
   }
 });
diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb
index 3a950b1c1a..379ee52f91 100644
--- a/app/controllers/people_controller.rb
+++ b/app/controllers/people_controller.rb
@@ -81,13 +81,11 @@ class PeopleController < ApplicationController
 
   def show
     @person = Person.find_from_guid_or_username(params)
-    flag = FeatureFlagger.new(current_user, @person)
-    logger.info(request.format)
 
     raise(ActiveRecord::RecordNotFound) if remote_profile_with_no_user_session?
     return redirect_to :back, :notice => t("people.show.closed_account") if @person.closed_account?
-    return redirect_to person_path(@person) if params[:ex] && !flag.new_profile?
-    return redirect_to person_path(@person, :ex => true) if !params[:ex] && flag.new_profile? && flag.new_hotness? && request.format == "text/html"
+    return redirect_to person_path(@person) if cant_experimental
+    return redirect_to person_path(@person, :ex => true) if needs_experimental
 
     @post_type = :all
     @aspect = :profile
@@ -121,7 +119,9 @@ class PeopleController < ApplicationController
       format.all do
         if params[:ex]
           @page = :experimental
-          render :text => @stream.stream_posts.as_api_response(:backbone).to_json, :layout => 'post'
+          json = @stream.stream_posts.as_api_response(:backbone).to_json
+          gon.stream = json
+          render :nothing => true, :layout => 'post'
         else
           respond_with @person, :locals => {:post_type => :all}
         end
@@ -189,9 +189,21 @@ class PeopleController < ApplicationController
     end
   end
 
-  private
+  protected
+
+  def flag
+     @flag ||= FeatureFlagger.new(current_user, @person)
+  end
+
+  def cant_experimental
+    params[:ex] && !flag.new_profile?
+  end
+
+  def needs_experimental
+    !params[:ex] && flag.new_profile? && flag.new_hotness? && request.format == "text/html"
+  end
 
   def remote_profile_with_no_user_session?
-    @person && @person.remote? && !user_signed_in?
+    @person.try(:remote?) && !user_signed_in?
   end
 end
diff --git a/app/views/layouts/post.html.haml b/app/views/layouts/post.html.haml
index 8dc76bd1b7..2d6de36df6 100644
--- a/app/views/layouts/post.html.haml
+++ b/app/views/layouts/post.html.haml
@@ -56,9 +56,11 @@
     = yield(:head)
     = csrf_meta_tag
 
+    = include_gon(:camel_case => true, :namespace => :preloads)
+
   %body
     = flash_messages
     #container
-    = javascript_tag  "window.preLoadContent = '#{escape_javascript(yield)}'"
+    = yield
 
     = include_chartbeat
diff --git a/spec/javascripts/app/pages/profile_spec.js b/spec/javascripts/app/pages/profile_spec.js
index 5837be142f..1547c18ee4 100644
--- a/spec/javascripts/app/pages/profile_spec.js
+++ b/spec/javascripts/app/pages/profile_spec.js
@@ -20,8 +20,13 @@ describe("app.pages.Profile", function(){
 
   it("preloads the stream for the user", function(){
     spyOn(this.stream, "preload")
+
+    window.preloads = {stream : JSON.stringify(["unicorns"]) }
+
     new app.pages.Profile({stream : this.stream})
     expect(this.stream.preload).toHaveBeenCalled()
+
+    delete window.preloads //cleanup
   })
 
   describe("rendering", function(){
-- 
GitLab