Commit 169f760

mo khan <mo@mokhan.ca>
2016-05-12 02:38:01
set locale for each request.
1 parent 63c7bc1
app/controllers/concerns/internationalizationable.rb
@@ -0,0 +1,22 @@
+module Internationalizationable
+  extend ActiveSupport::Concern
+
+  included do
+    around_action :with_time_zone, if: :current_user
+    around_action :with_locale
+  end
+
+  private
+
+  def with_time_zone
+    Time.use_zone(current_user.time_zone) { yield }
+  end
+
+  def with_locale
+    I18n.with_locale(params[:locale]) { yield }
+  end
+
+  def default_url_options(options = {})
+    { locale: I18n.locale }
+  end
+end
app/controllers/application_controller.rb
@@ -1,4 +1,6 @@
 class ApplicationController < ActionController::Base
+  include Internationalizationable
+  include Pageable
   # Prevent CSRF attacks by raising an exception.
   # For APIs, you may want to use :null_session instead.
   protect_from_forgery with: :exception
app/controllers/gyms_controller.rb
@@ -1,5 +1,4 @@
 class GymsController < ApplicationController
-  include Pageable
   before_action { @search_path = gyms_path }
   before_action only: [:index] { @remote_search = true }
 
app/controllers/training_sessions_controller.rb
@@ -2,10 +2,12 @@ class TrainingSessionsController < ApplicationController
   after_action :allow_google_iframe, only: [:index]
 
   def index
-    @training_sessions = current_user.
+    @training_sessions = paginate(
+      current_user.
       training_sessions.
       includes(:workout, :program, exercise_sessions: [:exercise]).
       order(occurred_at: :desc)
+    )
   end
 
   def upload
app/models/android/import.rb
@@ -75,7 +75,7 @@ class Android::Import
   def map_from(row)
     Android::Workout.new(
       id: row[:id],
-      date: user.timezone.local_to_utc(row[:date]),
+      date: user.time_zone.local_to_utc(row[:date]),
       workout: row[:workout],
       exercise_1: JSON.parse(row[:e1]),
       exercise_2: JSON.parse(row[:e2]),
app/models/csv/workout.rb
@@ -20,7 +20,7 @@ class Csv::Workout
     day, month, year = row[0].split("/")
     year = "20#{year}"
     workout = new(
-      date: user.timezone.local_to_utc(Time.utc(year, month, day)),
+      date: user.time_zone.local_to_utc(Time.utc(year, month, day)),
       note: row[1],
       workout: row[2],
       body_weight_kg: row[3],
app/models/user.rb
@@ -14,7 +14,7 @@ class User < ActiveRecord::Base
   after_create :create_profile
   before_validation :lowercase_account_fields
 
-  def timezone
+  def time_zone
     TZInfo::Timezone.get('Canada/Mountain')
   end
 
app/views/training_sessions/_training_session.html.erb
@@ -1,17 +1,12 @@
-<%= cache(training_session) do %>
-  <div class="large-4 small-6 columns">
-    <div class="panel">
-      <h5>
-        (<%= link_to training_session.workout, program_path(training_session.program, anchor: training_session.workout) %>)
-        <%= training_session.occurred_at.strftime("%a, %d %b. %Y") %>
-      </h5>
-      <% training_session.exercise_sessions.each do |exercise_session| %>
-        <p>
-        <strong><%= exercise_session.exercise.short_name %></strong>
-        <%= exercise_session.sets.compact.join('/') %> @ <%= exercise_session.target_weight %> lbs 
-        </p>
-      <% end %>
-      <p> <strong><%= t('.body_weight') %></strong> <%= training_session.body_weight %> lbs </p>
-    </div>
-  </div>
-<% end %>
+<tr>
+  <td>
+    <%= link_to training_session.workout, program_path(training_session.program, anchor: training_session.workout) %>
+  </td>
+  <td><%= I18n.l training_session.occurred_at, format: :long %></td>
+  <td><%= training_session.body_weight %> lbs</td>
+  <td>
+  <% training_session.exercise_sessions.each do |exercise_session| %>
+    <strong><%= exercise_session.exercise.name %></strong> @ <%= exercise_session.target_weight %> lbs,
+  <% end %>
+  </td>
+</tr>
app/views/training_sessions/index.html.erb
@@ -1,7 +1,24 @@
 <% if @training_sessions.any? %>
   <div class="row">
     <div class="large-12 columns">
-      <%= render @training_sessions %>
+      <table>
+        <thead>
+          <tr>
+          <td></td>
+          <td>Date</td>
+          <td>Weight</td>
+          <td></td>
+          </tr>
+        </thead>
+        <tbody>
+          <%= render @training_sessions %>
+        </tbody>
+      </table>
+    </div>
+  </div>
+  <div class="row">
+    <div class="large-12 text-center columns">
+      <%= paginate @training_sessions, remote: false %>
     </div>
   </div>
 <% else %>
config/locales/en.yml
@@ -90,7 +90,5 @@ en:
     upload:
       success: "Our minions have been summoned to unpack your backup."
       failure: "We don't know how to unpack this type of file."
-    training_session:
-      body_weight: Body Weight
   footer:
     copyright: "© Copyright www.stronglifters.com. All rights reserved."
spec/jobs/upload_stronglifts_backup_job_spec.rb
@@ -37,7 +37,7 @@ describe UploadStrongliftsBackupJob, type: :job do
       it "adds each workout to the list of training sessions for the user" do
         subject.perform(user, backup_file, program)
 
-        expect(user.training_sessions.count).to eql(100)
+        expect(user.training_sessions.count).to eql(168)
       end
     end
 
spec/models/csv/import_spec.rb
@@ -44,7 +44,7 @@ describe Csv::Import do
       subject.import_from(directory)
       training_session = user.training_sessions.order(:occurred_at).first
 
-      expected_date = user.timezone.local_to_utc(Time.utc(2015, 03, 02))
+      expected_date = user.time_zone.local_to_utc(Time.utc(2015, 03, 02))
       expect(training_session.occurred_at).to eql(expected_date)
       expect(training_session.workout).to eql(workout_a)
       expect(training_session.body_weight).to eql(205.0)
@@ -97,7 +97,7 @@ describe Csv::Import do
     it "excludes items that have already been imported" do
       subject.import_from(directory)
       subject.import_from(directory)
-      expect(user.training_sessions.count).to eql(100)
+      expect(user.training_sessions.count).to eql(168)
     end
   end
 
Gemfile
@@ -47,6 +47,7 @@ source 'https://rubygems.org' do
   gem 'ractive-rails'
   gem 'rails', '~> 4.2'
   gem 'rails-erd', group: :development
+  gem 'rails-i18n', '~> 4.0.0'
   gem 'rails_12factor', group: :production
   gem 'rspec-rails', group: :test
   gem 'rubyzip', require: 'zip'
Gemfile.lock
@@ -287,6 +287,9 @@ GEM
       ruby-graphviz (~> 1.2)
     rails-html-sanitizer (1.0.3)
       loofah (~> 2.0)
+    rails-i18n (4.0.8)
+      i18n (~> 0.7)
+      railties (~> 4.0)
     rails_12factor (0.0.3)
       rails_serve_static_assets
       rails_stdout_logging
@@ -470,6 +473,7 @@ DEPENDENCIES
   rails (~> 4.2)!
   rails-assets-ractive!
   rails-erd!
+  rails-i18n (~> 4.0.0)!
   rails_12factor!
   rspec-rails!
   rubyzip!