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 @@ - - - <% for column in Video.content_columns %> - - <% end %> + + + + + + + <% for video in @videos %> - - - <% for column in Video.content_columns %> - - <% end %> + + + + + + + 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

+ +
Video IDChecked Out<%= column.human_name %>Video IDChecked OutTitleNew ReleaseGenreDirectorMedia
<%=h video.id %><%=h video.checkedout? %><%=h video.send(column.name) %><%=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 %>
+ + <% for column in Videogenre.content_columns %> + + <% end %> + + +<% for videogenre in @videogenres %> + + <% for column in Videogenre.content_columns %> + + <% end %> + + + + +<% end %> +
<%= column.human_name %>
<%=h videogenre.send(column.name) %><%= 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 %>
+ +<%= 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