Commit 8d0f3c0
Changed files (18)
app
controllers
models
views
exercise_workouts
exercises
programs
training_sessions
workouts
config
db
spec
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