Commit 8d0f3c0

mo khan <mo@mokhan.ca>
2015-05-22 18:48:52
add programs route.
1 parent 495a06d
app/controllers/programs_controller.rb
@@ -0,0 +1,5 @@
+class ProgramsController < ApplicationController
+  def show
+    @program = Program.find_by(slug: params[:id])
+  end
+end
app/controllers/workouts_controller.rb
@@ -0,0 +1,5 @@
+class WorkoutsController < ApplicationController
+  def show
+    @workout = Workout.find_by(name: params[:id].upcase)
+  end
+end
app/models/program.rb
@@ -1,4 +1,15 @@
 class Program < ActiveRecord::Base
   has_many :exercises, through: :workouts
   has_many :workouts
+  before_save :save_slug
+
+  def to_param
+    slug
+  end
+
+  private
+
+  def save_slug
+    self.slug = name.parameterize
+  end
 end
app/models/workout.rb
@@ -3,6 +3,14 @@ class Workout < ActiveRecord::Base
   has_many :exercise_workouts
   has_many :exercises, through: :exercise_workouts
 
+  def slug
+    name.parameterize
+  end
+
+  def to_param
+    slug
+  end
+
   def add_exercise(exercise, sets:, repetitions:)
     exercise_workouts.create!(exercise: exercise, sets: sets, repetitions: repetitions)
   end
app/views/exercise_workouts/_exercise_workout.html.erb
@@ -0,0 +1,2 @@
+<%= render exercise_workout.exercise %>
+<p><%= exercise_workout.sets %> x <%= exercise_workout.repetitions %></p>
app/views/exercises/_exercise.html.erb
@@ -0,0 +1,1 @@
+<h2><%= exercise.name %><h2>
app/views/programs/show.html.erb
app/views/training_sessions/_training_session.html.erb
@@ -1,6 +1,6 @@
 <div class="large-4 small-6 columns">
   <div class="panel">
-    <h5><%= training_session.workout.name %></h5>
+    <h5><%= link_to training_session.workout.name, workout_path(training_session.workout.slug) %></h5>
     <h6 class="subheader"><%= distance_of_time_in_words_to_now training_session.occurred_at %> ago</h6>
     <% training_session.exercise_sessions.each do |exercise_session| %>
       <p><%= exercise_session.exercise.name %> @ <%= exercise_session.target_weight %> <%= exercise_session.sets.join(',') %> </p>
app/views/workouts/show.html.erb
@@ -0,0 +1,9 @@
+<div class="row">
+  <div class="small-12 columns">
+    <div class="row">
+      <h1>Workout <%= link_to @workout.name, workout_path(@workout) %> of <%= link_to @workout.program.name, program_path(@workout.program) %></h1>
+      <%= render @workout.exercise_workouts %>
+    </div>
+    </div>
+  </div>
+</div>
config/routes.rb
@@ -7,6 +7,8 @@ Rails.application.routes.draw do
       post :upload
     end
   end
+  resources :programs, only: [:show]
+  resources :workouts, only: [:show]
   get "/dashboard" => "training_sessions#index", as: :dashboard
   get "/terms" => "static_pages#terms"
 end
db/migrate/20150522183829_add_slug_to_programs.rb
@@ -0,0 +1,6 @@
+class AddSlugToPrograms < ActiveRecord::Migration
+  def change
+    add_column :programs, :slug, :string, null: false
+    add_index :programs, :slug, unique: true
+  end
+end
db/schema.rb
@@ -11,7 +11,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 20150522042027) do
+ActiveRecord::Schema.define(version: 20150522183829) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -45,8 +45,11 @@ ActiveRecord::Schema.define(version: 20150522042027) do
     t.string   "name",       null: false
     t.datetime "created_at", null: false
     t.datetime "updated_at", null: false
+    t.string   "slug",       null: false
   end
 
+  add_index "programs", ["slug"], name: "index_programs_on_slug", unique: true, using: :btree
+
   create_table "training_sessions", id: :uuid, default: "uuid_generate_v4()", force: :cascade do |t|
     t.uuid     "user_id",     null: false
     t.datetime "created_at",  null: false
spec/controllers/programs_controller_spec.rb
@@ -0,0 +1,18 @@
+require "rails_helper"
+
+describe ProgramsController do
+  let(:user) { create(:user) }
+
+  before :each do
+    http_login(user)
+  end
+
+  describe "#show" do
+    let(:program) { create(:program) }
+
+    it "loads the program" do
+      get :show, id: program.to_param
+      expect(assigns(:program)).to eql(program)
+    end
+  end
+end
spec/controllers/workouts_controller_spec.rb
@@ -0,0 +1,18 @@
+require "rails_helper"
+
+describe WorkoutsController do
+  let(:user) { create(:user) }
+
+  before :each do
+    http_login(user)
+  end
+
+  describe "#show" do
+    let(:workout) { create(:workout) }
+
+    it "loads the workout" do
+      get :show, id: workout.slug
+      expect(assigns(:workout)).to eql(workout)
+    end
+  end
+end
spec/models/program_spec.rb
@@ -0,0 +1,8 @@
+require 'rails_helper'
+
+describe Program do
+  it 'saves a slug' do
+    program = create(:program, name: 'Strong Lifts 5x5')
+    expect(program.slug).to eql('strong-lifts-5x5')
+  end
+end
spec/routing/programs_routing_spec.rb
@@ -0,0 +1,11 @@
+require 'rails_helper'
+
+describe '/programs' do
+  it 'routes to /programs/stronglifts-5x5' do
+    expect(get: '/programs/stronglifts-5x5').to route_to(
+      controller: 'programs',
+      action: 'show',
+      id: 'stronglifts-5x5'
+    )
+  end
+end
spec/routing/workouts_routing_spec.rb
@@ -0,0 +1,11 @@
+require 'rails_helper'
+
+describe '/workouts' do
+  it 'routes to the workouts/:id' do
+    expect(get: '/workouts/A').to route_to(
+      controller: 'workouts',
+      action: 'show',
+      id: 'A'
+    )
+  end
+end
spec/factories.rb
@@ -17,6 +17,7 @@ FactoryGirl.define do
     terms_and_conditions "1"
   end
   factory :workout do
+    association :program
     name { FFaker::Internet.user_name }
   end
 end