Add real Gamegenre support
authorIra W. Snyder <devel@irasnyder.com>
Fri, 23 Nov 2007 19:17:51 +0000 (11:17 -0800)
committerIra W. Snyder <devel@irasnyder.com>
Fri, 23 Nov 2007 19:17:51 +0000 (11:17 -0800)
This adds real, chooseable game genres, modeled after the Videogenre
code.

Signed-off-by: Ira W. Snyder <devel@irasnyder.com>
20 files changed:
app/controllers/gamegenre_controller.rb [new file with mode: 0644]
app/helpers/gamegenre_helper.rb [new file with mode: 0644]
app/models/game.rb
app/models/gamegenre.rb [new file with mode: 0644]
app/models/video.rb
app/views/game/_form.rhtml
app/views/game/list.rhtml
app/views/gamegenre/_form.rhtml [new file with mode: 0644]
app/views/gamegenre/edit.rhtml [new file with mode: 0644]
app/views/gamegenre/list.rhtml [new file with mode: 0644]
app/views/gamegenre/new.rhtml [new file with mode: 0644]
app/views/gamegenre/show.rhtml [new file with mode: 0644]
app/views/layouts/gamegenre.rhtml [new file with mode: 0644]
app/views/video/list.rhtml
db/development.sqlite3
db/migrate/024_create_gamegenres.rb [new file with mode: 0644]
db/schema.rb
test/fixtures/gamegenres.yml [new file with mode: 0644]
test/functional/gamegenre_controller_test.rb [new file with mode: 0644]
test/unit/gamegenre_test.rb [new file with mode: 0644]

diff --git a/app/controllers/gamegenre_controller.rb b/app/controllers/gamegenre_controller.rb
new file mode 100644 (file)
index 0000000..1293676
--- /dev/null
@@ -0,0 +1,51 @@
+class GamegenreController < 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
+    @gamegenre_pages, @gamegenres = paginate :gamegenres, :per_page => 10
+  end
+
+  def show
+    @gamegenre = Gamegenre.find(params[:id])
+  end
+
+  def new
+    @gamegenre = Gamegenre.new
+  end
+
+  def create
+    @gamegenre = Gamegenre.new(params[:gamegenre])
+    if @gamegenre.save
+      flash[:notice] = 'Gamegenre was successfully created.'
+      redirect_to :action => 'list'
+    else
+      render :action => 'new'
+    end
+  end
+
+  def edit
+    @gamegenre = Gamegenre.find(params[:id])
+  end
+
+  def update
+    @gamegenre = Gamegenre.find(params[:id])
+    if @gamegenre.update_attributes(params[:gamegenre])
+      flash[:notice] = 'Gamegenre was successfully updated.'
+      redirect_to :action => 'show', :id => @gamegenre
+    else
+      render :action => 'edit'
+    end
+  end
+
+  def destroy
+    Gamegenre.find(params[:id]).destroy
+    redirect_to :action => 'list'
+  end
+end
diff --git a/app/helpers/gamegenre_helper.rb b/app/helpers/gamegenre_helper.rb
new file mode 100644 (file)
index 0000000..d53499c
--- /dev/null
@@ -0,0 +1,2 @@
+module GamegenreHelper
+end
index 6c6b59b..15bf8e0 100644 (file)
@@ -2,6 +2,10 @@ class Game < Rentable
   validates_presence_of :game_genre
   validates_presence_of :platform
 
+  def genre
+    return Gamegenre.find(game_genre).name
+  end
+
   def calculated_price
     # FIXME: generate this based on day of week, newrelease
     day_of_week = Time.now.to_date.wday
diff --git a/app/models/gamegenre.rb b/app/models/gamegenre.rb
new file mode 100644 (file)
index 0000000..5a6631a
--- /dev/null
@@ -0,0 +1,2 @@
+class Gamegenre < ActiveRecord::Base
+end
index 52344e1..b20602a 100644 (file)
@@ -6,6 +6,14 @@ class Video < Rentable
   validates_presence_of :video_genre
   validates_presence_of :media
 
+  def genre
+    return Videogenre.find(video_genre).name
+  end
+
+  def media_name
+    return Media.find(media).name
+  end
+
   def calculated_price
     # FIXME: generate this based on day of week, newrelease
     day_of_week = Time.now.to_date.wday
index b264601..b65208f 100644 (file)
@@ -11,6 +11,6 @@
 <%= text_field 'game', 'platform'  %></p>
 
 <p><label for="game_genre">Genre</label><br/>
-<%= text_field 'game', 'game_genre'  %></p>
+<%= select 'game', 'game_genre', Gamegenre.find(:all).collect {|c| [c.name.to_s, c.id] } %></p>
 <!--[eoform:game]-->
 
index 1a17dbf..fce55da 100644 (file)
@@ -2,20 +2,22 @@
 
 <table>
   <tr>
-  <th>Game ID</th>
-  <th>Checked Out</th>
-  <% for column in Game.content_columns %>
-    <th><%= column.human_name %></th>
-  <% end %>
+    <th>Game ID</th>
+    <th>Checked Out</th>
+    <th>Title</th>
+    <th>New Release</th>
+    <th>Genre</th>
+    <td>Platform</th>
   </tr>
   
 <% for game in @games %>
   <tr>
-  <td><%=h game.id %></td>
-  <td><%=h game.checkedout? %></td>
-  <% for column in Game.content_columns %>
-    <td><%=h game.send(column.name) %></td>
-  <% end %>
+    <td><%=h game.id %></td>
+    <td><%=h game.checkedout? %></td>
+    <td><%=h game.title %></td>
+    <td><%=h game.newrelease %></td>
+    <td><%=h game.genre %></td>
+    <td>FIXME</td>
     <td><%= link_to 'Show', :action => 'show', :id => game %></td>
     <td><%= link_to 'Edit', :action => 'edit', :id => game %></td>
     <td><%= link_to 'Destroy', { :action => 'destroy', :id => game }, :confirm => 'Are you sure?', :method => :post %></td>
diff --git a/app/views/gamegenre/_form.rhtml b/app/views/gamegenre/_form.rhtml
new file mode 100644 (file)
index 0000000..9378e76
--- /dev/null
@@ -0,0 +1,7 @@
+<%= error_messages_for 'gamegenre' %>
+
+<!--[form:gamegenre]-->
+<p><label for="gamegenre_name">Name</label><br/>
+<%= text_field 'gamegenre', 'name'  %></p>
+<!--[eoform:gamegenre]-->
+
diff --git a/app/views/gamegenre/edit.rhtml b/app/views/gamegenre/edit.rhtml
new file mode 100644 (file)
index 0000000..e5246a9
--- /dev/null
@@ -0,0 +1,9 @@
+<h1>Editing gamegenre</h1>
+
+<% form_tag :action => 'update', :id => @gamegenre do %>
+  <%= render :partial => 'form' %>
+  <%= submit_tag 'Edit' %>
+<% end %>
+
+<%= link_to 'Show', :action => 'show', :id => @gamegenre %> |
+<%= link_to 'Back', :action => 'list' %>
diff --git a/app/views/gamegenre/list.rhtml b/app/views/gamegenre/list.rhtml
new file mode 100644 (file)
index 0000000..21e0ea3
--- /dev/null
@@ -0,0 +1,27 @@
+<h1>Listing gamegenres</h1>
+
+<table>
+  <tr>
+  <% for column in Gamegenre.content_columns %>
+    <th><%= column.human_name %></th>
+  <% end %>
+  </tr>
+  
+<% for gamegenre in @gamegenres %>
+  <tr>
+  <% for column in Gamegenre.content_columns %>
+    <td><%=h gamegenre.send(column.name) %></td>
+  <% end %>
+    <td><%= link_to 'Show', :action => 'show', :id => gamegenre %></td>
+    <td><%= link_to 'Edit', :action => 'edit', :id => gamegenre %></td>
+    <td><%= link_to 'Destroy', { :action => 'destroy', :id => gamegenre }, :confirm => 'Are you sure?', :method => :post %></td>
+  </tr>
+<% end %>
+</table>
+
+<%= link_to 'Previous page', { :page => @gamegenre_pages.current.previous } if @gamegenre_pages.current.previous %>
+<%= link_to 'Next page', { :page => @gamegenre_pages.current.next } if @gamegenre_pages.current.next %> 
+
+<br />
+
+<%= link_to 'New gamegenre', :action => 'new' %>
diff --git a/app/views/gamegenre/new.rhtml b/app/views/gamegenre/new.rhtml
new file mode 100644 (file)
index 0000000..98a943f
--- /dev/null
@@ -0,0 +1,8 @@
+<h1>New gamegenre</h1>
+
+<% form_tag :action => 'create' do %>
+  <%= render :partial => 'form' %>
+  <%= submit_tag "Create" %>
+<% end %>
+
+<%= link_to 'Back', :action => 'list' %>
diff --git a/app/views/gamegenre/show.rhtml b/app/views/gamegenre/show.rhtml
new file mode 100644 (file)
index 0000000..417f406
--- /dev/null
@@ -0,0 +1,8 @@
+<% for column in Gamegenre.content_columns %>
+<p>
+  <b><%= column.human_name %>:</b> <%=h @gamegenre.send(column.name) %>
+</p>
+<% end %>
+
+<%= link_to 'Edit', :action => 'edit', :id => @gamegenre %> |
+<%= link_to 'Back', :action => 'list' %>
diff --git a/app/views/layouts/gamegenre.rhtml b/app/views/layouts/gamegenre.rhtml
new file mode 100644 (file)
index 0000000..ab082d2
--- /dev/null
@@ -0,0 +1,17 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
+  <title>Gamegenre: <%= controller.action_name %></title>
+  <%= stylesheet_link_tag 'scaffold' %>
+</head>
+<body>
+
+<p style="color: green"><%= flash[:notice] %></p>
+
+<%= yield  %>
+
+</body>
+</html>
index d74ec25..afe84ed 100644 (file)
@@ -17,9 +17,9 @@
     <td><%=h video.checkedout? %></td>
     <td><%=h video.title %></td>
     <td><%=h video.newrelease %></td>
-    <td><%=h Videogenre.find(video.video_genre).name %></td>
+    <td><%=h video.genre %></td>
     <td><%=h video.director %></td>
-    <td><%=h Media.find(video.media).name %></td>
+    <td><%=h video.media_name %></td>
     <td><%= link_to 'Show', :action => 'show', :id => video %></td>
     <td><%= link_to 'Edit', :action => 'edit', :id => video %></td>
     <td><%= link_to 'Destroy', { :action => 'destroy', :id => video }, :confirm => 'Are you sure?', :method => :post %></td>
index 3c5a59d..6285c9d 100644 (file)
Binary files a/db/development.sqlite3 and b/db/development.sqlite3 differ
diff --git a/db/migrate/024_create_gamegenres.rb b/db/migrate/024_create_gamegenres.rb
new file mode 100644 (file)
index 0000000..181d45b
--- /dev/null
@@ -0,0 +1,11 @@
+class CreateGamegenres < ActiveRecord::Migration
+  def self.up
+    create_table :gamegenres do |t|
+      t.column :name, :string, :null => false
+    end
+  end
+
+  def self.down
+    drop_table :gamegenres
+  end
+end
index 5e0c608..d372187 100644 (file)
@@ -2,7 +2,7 @@
 # migrations feature of ActiveRecord to incrementally modify your database, and
 # then regenerate this schema definition.
 
-ActiveRecord::Schema.define(:version => 23) do
+ActiveRecord::Schema.define(:version => 24) do
 
   create_table "bitems", :force => true do |t|
     t.column "customer_id",    :integer, :null => false
@@ -32,6 +32,10 @@ ActiveRecord::Schema.define(:version => 23) do
     t.column "description", :string
   end
 
+  create_table "gamegenres", :force => true do |t|
+    t.column "name", :string, :null => false
+  end
+
   create_table "medias", :force => true do |t|
     t.column "name", :string, :null => false
   end
diff --git a/test/fixtures/gamegenres.yml b/test/fixtures/gamegenres.yml
new file mode 100644 (file)
index 0000000..b49c4eb
--- /dev/null
@@ -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/gamegenre_controller_test.rb b/test/functional/gamegenre_controller_test.rb
new file mode 100644 (file)
index 0000000..aa660e6
--- /dev/null
@@ -0,0 +1,92 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require 'gamegenre_controller'
+
+# Re-raise errors caught by the controller.
+class GamegenreController; def rescue_action(e) raise e end; end
+
+class GamegenreControllerTest < Test::Unit::TestCase
+  fixtures :gamegenres
+
+  def setup
+    @controller = GamegenreController.new
+    @request    = ActionController::TestRequest.new
+    @response   = ActionController::TestResponse.new
+
+    @first_id = gamegenres(: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(:gamegenres)
+  end
+
+  def test_show
+    get :show, :id => @first_id
+
+    assert_response :success
+    assert_template 'show'
+
+    assert_not_nil assigns(:gamegenre)
+    assert assigns(:gamegenre).valid?
+  end
+
+  def test_new
+    get :new
+
+    assert_response :success
+    assert_template 'new'
+
+    assert_not_nil assigns(:gamegenre)
+  end
+
+  def test_create
+    num_gamegenres = Gamegenre.count
+
+    post :create, :gamegenre => {}
+
+    assert_response :redirect
+    assert_redirected_to :action => 'list'
+
+    assert_equal num_gamegenres + 1, Gamegenre.count
+  end
+
+  def test_edit
+    get :edit, :id => @first_id
+
+    assert_response :success
+    assert_template 'edit'
+
+    assert_not_nil assigns(:gamegenre)
+    assert assigns(:gamegenre).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 {
+      Gamegenre.find(@first_id)
+    }
+
+    post :destroy, :id => @first_id
+    assert_response :redirect
+    assert_redirected_to :action => 'list'
+
+    assert_raise(ActiveRecord::RecordNotFound) {
+      Gamegenre.find(@first_id)
+    }
+  end
+end
diff --git a/test/unit/gamegenre_test.rb b/test/unit/gamegenre_test.rb
new file mode 100644 (file)
index 0000000..1a72d2c
--- /dev/null
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class GamegenreTest < Test::Unit::TestCase
+  fixtures :gamegenres
+
+  # Replace this with your real tests.
+  def test_truth
+    assert true
+  end
+end