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