From d13e443cd5c78d0d4d5053202a70a251b3e6d111 Mon Sep 17 00:00:00 2001
From: "Ira W. Snyder"
Date: Wed, 21 Nov 2007 23:41:18 -0800
Subject: [PATCH] Add real, selectable videogenres
Signed-off-by: Ira W. Snyder
---
app/controllers/videogenre_controller.rb | 51 ++++++++++
app/helpers/videogenre_helper.rb | 2 +
app/models/video.rb | 7 ++
app/models/videogenre.rb | 5 +
app/views/layouts/videogenre.rhtml | 17 ++++
app/views/video/_form.rhtml | 2 +-
app/views/video/list.rhtml | 24 +++--
app/views/videogenre/_form.rhtml | 7 ++
app/views/videogenre/edit.rhtml | 9 ++
app/views/videogenre/list.rhtml | 27 +++++
app/views/videogenre/new.rhtml | 8 ++
app/views/videogenre/show.rhtml | 8 ++
db/development.sqlite3 | Bin 9216 -> 9216 bytes
db/migrate/011_create_videogenres.rb | 11 +++
db/schema.rb | 6 +-
test/fixtures/videogenres.yml | 5 +
test/functional/videogenre_controller_test.rb | 92 ++++++++++++++++++
test/unit/videogenre_test.rb | 10 ++
18 files changed, 279 insertions(+), 12 deletions(-)
create mode 100644 app/controllers/videogenre_controller.rb
create mode 100644 app/helpers/videogenre_helper.rb
create mode 100644 app/models/videogenre.rb
create mode 100644 app/views/layouts/videogenre.rhtml
create mode 100644 app/views/videogenre/_form.rhtml
create mode 100644 app/views/videogenre/edit.rhtml
create mode 100644 app/views/videogenre/list.rhtml
create mode 100644 app/views/videogenre/new.rhtml
create mode 100644 app/views/videogenre/show.rhtml
create mode 100644 db/migrate/011_create_videogenres.rb
create mode 100644 test/fixtures/videogenres.yml
create mode 100644 test/functional/videogenre_controller_test.rb
create mode 100644 test/unit/videogenre_test.rb
diff --git a/app/controllers/videogenre_controller.rb b/app/controllers/videogenre_controller.rb
new file mode 100644
index 0000000..2462099
--- /dev/null
+++ b/app/controllers/videogenre_controller.rb
@@ -0,0 +1,51 @@
+class VideogenreController < ApplicationController
+ def index
+ list
+ render :action => 'list'
+ end
+
+ # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
+ verify :method => :post, :only => [ :destroy, :create, :update ],
+ :redirect_to => { :action => :list }
+
+ def list
+ @videogenre_pages, @videogenres = paginate :videogenres, :per_page => 10
+ end
+
+ def show
+ @videogenre = Videogenre.find(params[:id])
+ end
+
+ def new
+ @videogenre = Videogenre.new
+ end
+
+ def create
+ @videogenre = Videogenre.new(params[:videogenre])
+ if @videogenre.save
+ flash[:notice] = 'Videogenre was successfully created.'
+ redirect_to :action => 'list'
+ else
+ render :action => 'new'
+ end
+ end
+
+ def edit
+ @videogenre = Videogenre.find(params[:id])
+ end
+
+ def update
+ @videogenre = Videogenre.find(params[:id])
+ if @videogenre.update_attributes(params[:videogenre])
+ flash[:notice] = 'Videogenre was successfully updated.'
+ redirect_to :action => 'show', :id => @videogenre
+ else
+ render :action => 'edit'
+ end
+ end
+
+ def destroy
+ Videogenre.find(params[:id]).destroy
+ redirect_to :action => 'list'
+ end
+end
diff --git a/app/helpers/videogenre_helper.rb b/app/helpers/videogenre_helper.rb
new file mode 100644
index 0000000..f369342
--- /dev/null
+++ b/app/helpers/videogenre_helper.rb
@@ -0,0 +1,2 @@
+module VideogenreHelper
+end
diff --git a/app/models/video.rb b/app/models/video.rb
index 50733d5..abf0de3 100644
--- a/app/models/video.rb
+++ b/app/models/video.rb
@@ -1,5 +1,12 @@
class Video < Rentable
+ has_many :video_genres
+
validates_presence_of :director
validates_presence_of :video_genre
validates_presence_of :media
+
+ protected
+ def validate
+ errors.add(:video_genre, "does not exist in the database") if video_genre.nil?
+ end
end
diff --git a/app/models/videogenre.rb b/app/models/videogenre.rb
new file mode 100644
index 0000000..5182e33
--- /dev/null
+++ b/app/models/videogenre.rb
@@ -0,0 +1,5 @@
+class Videogenre < ActiveRecord::Base
+ belongs_to :video
+
+ validates_presence_of :name
+end
diff --git a/app/views/layouts/videogenre.rhtml b/app/views/layouts/videogenre.rhtml
new file mode 100644
index 0000000..ede979e
--- /dev/null
+++ b/app/views/layouts/videogenre.rhtml
@@ -0,0 +1,17 @@
+
+
+
+
+
+ Videogenre: <%= controller.action_name %>
+ <%= stylesheet_link_tag 'scaffold' %>
+
+
+
+<%= flash[:notice] %>
+
+<%= yield %>
+
+
+
diff --git a/app/views/video/_form.rhtml b/app/views/video/_form.rhtml
index 10f345a..c990254 100644
--- a/app/views/video/_form.rhtml
+++ b/app/views/video/_form.rhtml
@@ -8,7 +8,7 @@
<%= check_box 'video', 'newrelease' %>
-<%= text_field 'video', 'video_genre' %>
+<%= select 'video', 'video_genre', Videogenre.find(:all).collect {|c| [c.name.to_s, c.id] } %>
<%= text_field 'video', 'director' %>
diff --git a/app/views/video/list.rhtml b/app/views/video/list.rhtml
index 1a0ec16..27bd318 100644
--- a/app/views/video/list.rhtml
+++ b/app/views/video/list.rhtml
@@ -2,20 +2,24 @@
- Video ID |
- Checked Out |
- <% for column in Video.content_columns %>
- <%= column.human_name %> |
- <% end %>
+ Video ID |
+ Checked Out |
+ Title |
+ New Release |
+ Genre |
+ Director |
+ Media |
<% for video in @videos %>
- <%=h video.id %> |
- <%=h video.checkedout? %> |
- <% for column in Video.content_columns %>
- <%=h video.send(column.name) %> |
- <% end %>
+ <%=h video.id %> |
+ <%=h video.checkedout? %> |
+ <%=h video.title %> |
+ <%=h video.newrelease %> |
+ <%=h Videogenre.find(video.video_genre).name %> |
+ <%=h video.director %> |
+ <%=h video.media %> |
<%= link_to 'Show', :action => 'show', :id => video %> |
<%= link_to 'Edit', :action => 'edit', :id => video %> |
<%= link_to 'Destroy', { :action => 'destroy', :id => video }, :confirm => 'Are you sure?', :method => :post %> |
diff --git a/app/views/videogenre/_form.rhtml b/app/views/videogenre/_form.rhtml
new file mode 100644
index 0000000..4082225
--- /dev/null
+++ b/app/views/videogenre/_form.rhtml
@@ -0,0 +1,7 @@
+<%= error_messages_for 'videogenre' %>
+
+
+
+<%= text_field 'videogenre', 'name' %>
+
+
diff --git a/app/views/videogenre/edit.rhtml b/app/views/videogenre/edit.rhtml
new file mode 100644
index 0000000..b281524
--- /dev/null
+++ b/app/views/videogenre/edit.rhtml
@@ -0,0 +1,9 @@
+Editing videogenre
+
+<% form_tag :action => 'update', :id => @videogenre do %>
+ <%= render :partial => 'form' %>
+ <%= submit_tag 'Edit' %>
+<% end %>
+
+<%= link_to 'Show', :action => 'show', :id => @videogenre %> |
+<%= link_to 'Back', :action => 'list' %>
diff --git a/app/views/videogenre/list.rhtml b/app/views/videogenre/list.rhtml
new file mode 100644
index 0000000..1ef4849
--- /dev/null
+++ b/app/views/videogenre/list.rhtml
@@ -0,0 +1,27 @@
+Listing videogenres
+
+
+
+ <% for column in Videogenre.content_columns %>
+ <%= column.human_name %> |
+ <% end %>
+
+
+<% for videogenre in @videogenres %>
+
+ <% for column in Videogenre.content_columns %>
+ <%=h videogenre.send(column.name) %> |
+ <% end %>
+ <%= link_to 'Show', :action => 'show', :id => videogenre %> |
+ <%= link_to 'Edit', :action => 'edit', :id => videogenre %> |
+ <%= link_to 'Destroy', { :action => 'destroy', :id => videogenre }, :confirm => 'Are you sure?', :method => :post %> |
+
+<% end %>
+
+
+<%= link_to 'Previous page', { :page => @videogenre_pages.current.previous } if @videogenre_pages.current.previous %>
+<%= link_to 'Next page', { :page => @videogenre_pages.current.next } if @videogenre_pages.current.next %>
+
+
+
+<%= link_to 'New videogenre', :action => 'new' %>
diff --git a/app/views/videogenre/new.rhtml b/app/views/videogenre/new.rhtml
new file mode 100644
index 0000000..e842ea3
--- /dev/null
+++ b/app/views/videogenre/new.rhtml
@@ -0,0 +1,8 @@
+New videogenre
+
+<% form_tag :action => 'create' do %>
+ <%= render :partial => 'form' %>
+ <%= submit_tag "Create" %>
+<% end %>
+
+<%= link_to 'Back', :action => 'list' %>
diff --git a/app/views/videogenre/show.rhtml b/app/views/videogenre/show.rhtml
new file mode 100644
index 0000000..9df8b32
--- /dev/null
+++ b/app/views/videogenre/show.rhtml
@@ -0,0 +1,8 @@
+<% for column in Videogenre.content_columns %>
+
+ <%= column.human_name %>: <%=h @videogenre.send(column.name) %>
+
+<% end %>
+
+<%= link_to 'Edit', :action => 'edit', :id => @videogenre %> |
+<%= link_to 'Back', :action => 'list' %>
diff --git a/db/development.sqlite3 b/db/development.sqlite3
index 166de3977c625026765e59abe4a549fbcb0db2d1..f020ede71df316999a64794be0ea1621a822dde0 100644
GIT binary patch
delta 426
zcmYk1Jxjw-6o&7)=aQyTTeNBwKS*^^&|TCeN=t{*La7c)k*c>f8WWQgKL$~^A`Z$0
ze}WD!rk$Jw5&Q$rf{KgIf>1$I1nCQh^KzcUIlPC-!{ljS`wjV1z;EE!_}SRB0$6WM
zgIM?M6QmNWvLA$&s?1m`!wSI{yvGZyc=j$T{Y)YNu^5%ab+}7hhVvZ(3=w?8JAdaG
zH*g$7p8Z7^2LcL-#=-#pqj`OmTbiMBQ%&n8FET==B_A&};gsd9s#Z}guW>c2no1ocHA|6s~Hqg=#fF7q7qpE5U-J#f{-VWhbwyS*%=VG18MQl{ZY$zt%Kai)=*9E
z`9?p`Bf(F6$0vNOwX=JikQtJwX6l<Nf>|!OdqIk%H)%PJa|-6ku~X5(5euI99vR9yWB;(2I9
QYz#(%=}b;d&!tkMzxIi5Z~y=R
delta 427
zcmZqhXz-XIEx48e0@#5RGZ5=c)Un}UU;zuVZ5Cviz&uHYWit!QZ)QfWO&lyNT+GbN
z7?>Y1A7Newl%2smc^Q8kA1iY<1M^enL(I#VyO^^#Hbyc}&K8zoWSHC`90epF3oG)l
zFhnyjZ(=&m7|RenvC(^Ty%H1S=4oPCjFVT3zMdQ_>c;_b2Lsb)4v9a^T+EF785s97
z@iL2UY~08QQoz;3%ET@%FVENH$#}HSA
z5Jx8;R|T-xgJ;^N|r&8%R1(-U)3i@^jtimgDQ$!Ekg
Ufkr7!ekd--tfQa=vyM>{07v+AfdBvi
diff --git a/db/migrate/011_create_videogenres.rb b/db/migrate/011_create_videogenres.rb
new file mode 100644
index 0000000..a94d38e
--- /dev/null
+++ b/db/migrate/011_create_videogenres.rb
@@ -0,0 +1,11 @@
+class CreateVideogenres < ActiveRecord::Migration
+ def self.up
+ create_table :videogenres do |t|
+ t.column :name, :string, :null => false
+ end
+ end
+
+ def self.down
+ drop_table :videogenres
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 5c26969..f099861 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -2,7 +2,7 @@
# migrations feature of ActiveRecord to incrementally modify your database, and
# then regenerate this schema definition.
-ActiveRecord::Schema.define(:version => 10) do
+ActiveRecord::Schema.define(:version => 11) do
create_table "coitems", :force => true do |t|
t.column "customer_id", :integer
@@ -30,4 +30,8 @@ ActiveRecord::Schema.define(:version => 10) do
t.column "platform", :integer
end
+ create_table "videogenres", :force => true do |t|
+ t.column "name", :string, :null => false
+ end
+
end
diff --git a/test/fixtures/videogenres.yml b/test/fixtures/videogenres.yml
new file mode 100644
index 0000000..b49c4eb
--- /dev/null
+++ b/test/fixtures/videogenres.yml
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+ id: 1
+two:
+ id: 2
diff --git a/test/functional/videogenre_controller_test.rb b/test/functional/videogenre_controller_test.rb
new file mode 100644
index 0000000..2186b18
--- /dev/null
+++ b/test/functional/videogenre_controller_test.rb
@@ -0,0 +1,92 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require 'videogenre_controller'
+
+# Re-raise errors caught by the controller.
+class VideogenreController; def rescue_action(e) raise e end; end
+
+class VideogenreControllerTest < Test::Unit::TestCase
+ fixtures :videogenres
+
+ def setup
+ @controller = VideogenreController.new
+ @request = ActionController::TestRequest.new
+ @response = ActionController::TestResponse.new
+
+ @first_id = videogenres(:first).id
+ end
+
+ def test_index
+ get :index
+ assert_response :success
+ assert_template 'list'
+ end
+
+ def test_list
+ get :list
+
+ assert_response :success
+ assert_template 'list'
+
+ assert_not_nil assigns(:videogenres)
+ end
+
+ def test_show
+ get :show, :id => @first_id
+
+ assert_response :success
+ assert_template 'show'
+
+ assert_not_nil assigns(:videogenre)
+ assert assigns(:videogenre).valid?
+ end
+
+ def test_new
+ get :new
+
+ assert_response :success
+ assert_template 'new'
+
+ assert_not_nil assigns(:videogenre)
+ end
+
+ def test_create
+ num_videogenres = Videogenre.count
+
+ post :create, :videogenre => {}
+
+ assert_response :redirect
+ assert_redirected_to :action => 'list'
+
+ assert_equal num_videogenres + 1, Videogenre.count
+ end
+
+ def test_edit
+ get :edit, :id => @first_id
+
+ assert_response :success
+ assert_template 'edit'
+
+ assert_not_nil assigns(:videogenre)
+ assert assigns(:videogenre).valid?
+ end
+
+ def test_update
+ post :update, :id => @first_id
+ assert_response :redirect
+ assert_redirected_to :action => 'show', :id => @first_id
+ end
+
+ def test_destroy
+ assert_nothing_raised {
+ Videogenre.find(@first_id)
+ }
+
+ post :destroy, :id => @first_id
+ assert_response :redirect
+ assert_redirected_to :action => 'list'
+
+ assert_raise(ActiveRecord::RecordNotFound) {
+ Videogenre.find(@first_id)
+ }
+ end
+end
diff --git a/test/unit/videogenre_test.rb b/test/unit/videogenre_test.rb
new file mode 100644
index 0000000..5290195
--- /dev/null
+++ b/test/unit/videogenre_test.rb
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class VideogenreTest < Test::Unit::TestCase
+ fixtures :videogenres
+
+ # Replace this with your real tests.
+ def test_truth
+ assert true
+ end
+end
--
2.25.1