Skip to content

Commit 17fcc2b

Browse files
committed
Added directors model
1 parent 6519567 commit 17fcc2b

27 files changed

+418
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Place all the behaviors and hooks related to the matching controller here.
2+
# All this logic will automatically be available in application.js.
3+
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

app/assets/javascripts/movies.js.coffee

+74
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ jQuery ->
1010
noneSelectedText: "Select actors",
1111
selectedText: "# actors selected"
1212
).multiselectfilter()
13+
# Multiselect for movie index, to filter movies by one or more directors
14+
$("select#director").multiselect(
15+
selectedList: false,
16+
noneSelectedText: "Select directors",
17+
selectedText: "# directors selected"
18+
).multiselectfilter()
1319
# Toggle the filter controls
1420
$("#filters-toggle").click( ->
1521
$("#new-filters").toggle("blind")
@@ -167,6 +173,74 @@ jQuery ->
167173
)
168174
)
169175

176+
# Helper function for inserting html representing directors
177+
logDirector = (name, val) ->
178+
#console.log(name)
179+
$("#director-list").append($("<li>").text(name).attr("data-id", val).append($("<p class=\"delete-director\">").button(
180+
icons:
181+
primary: "ui-icon\-closethick"
182+
text: false
183+
).click( ->
184+
$(this).parent().remove()
185+
$("option.director[value="+val+"]").remove())))
186+
$("#movie_directors").append("<option class=\"director\" selected=\"true\" value=\"" + val + "\">" + name + "</option>")
187+
# Button to remove director's from the movie's list
188+
$(".delete-director").button(
189+
icons:
190+
primary: "ui-icon\-closethick"
191+
text: false
192+
).click( ->
193+
id = $(this).parent().attr("data-id")
194+
$(this).parent().remove()
195+
$("option.director[value="+id+"]").remove())
196+
# Autocomplete box for adding directors to the movie's list
197+
$(".director-picker").autocomplete(
198+
source: (request, response) ->
199+
$.getJSON("/directors.json", (rawdata) ->
200+
matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i")
201+
data = []
202+
for obj in rawdata
203+
data.push({"label": obj.firstname + " " + obj.lastname, "value": obj.id})
204+
response($.grep(data, (el, index) ->
205+
return matcher.test(el.label)
206+
))
207+
)
208+
select: (event, ui)->
209+
if ui.item && ($("option.director[value=" + ui.item.value + "]").length == 0)
210+
logDirector(ui.item.label, ui.item.value)
211+
event.preventDefault()
212+
$(this).autocomplete("close")
213+
$(this).val("")
214+
response: (event, ui) ->
215+
if ui.content.length == 0
216+
strg = this.value
217+
length = strg.length
218+
idex = strg.lastIndexOf " " # seperates firstname and lastname based on last space
219+
fname = strg.substr(0, idex)
220+
lname = strg.substr(idex+1, length - idex - 1)
221+
$("#create-new-director").show().text("Create " + this.value).attr("data-firstname", fname).attr("data-lastname", lname)
222+
else
223+
$("#create-new-director").hide()
224+
)
225+
# Button for adding new director to the database
226+
$("#create-new-director").click( ->
227+
firstname = $(this).attr("data-firstname")
228+
lastname = $(this).attr("data-lastname")
229+
$.ajax(
230+
url: "/directors.json",
231+
type: "POST",
232+
data:
233+
"director[firstname]": firstname,
234+
"director[lastname]": lastname,
235+
success: (a,b,c,d) ->
236+
logDirector(firstname + " " + lastname, a.id)
237+
$("#create-new-director").hide()
238+
failure: (a,b,c,d) ->
239+
alert "Failure"
240+
console.log(a, b, c, d)
241+
)
242+
)
243+
170244
# Control for adding a viewing date to the movie
171245
if $("body").data("action") == "show"
172246
convertDateFormat = (date) ->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// Place all the styles related to the Directors controller here.
2+
// They will automatically be included in application.css.
3+
// You can use Sass (SCSS) here: http://sass-lang.com/
+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
class DirectorsController < ApplicationController
2+
# GET /directors
3+
# GET /directors.json
4+
def index
5+
@directors = Director.order(:lastname, :firstname)
6+
7+
if params[:q]
8+
@directors.keep_if {|director| director.name =~ Regexp.new(Regexp.escape(params[:q]))}
9+
end
10+
11+
@search = params[:q] || ""
12+
13+
respond_to do |format|
14+
format.html # index.html.erb
15+
format.json { render json: @directors }
16+
end
17+
end
18+
19+
# GET /directors/1
20+
# GET /directors/1.json
21+
def show
22+
@director = Director.find(params[:id])
23+
24+
respond_to do |format|
25+
format.html # show.html.erb
26+
format.json { render json: @director }
27+
end
28+
end
29+
30+
# GET /directors/new
31+
# GET /directors/new.json
32+
def new
33+
@director = Director.new
34+
35+
respond_to do |format|
36+
format.html # new.html.erb
37+
format.json { render json: @director }
38+
end
39+
end
40+
41+
# GET /directors/1/edit
42+
def edit
43+
@director = Director.find(params[:id])
44+
end
45+
46+
# POST /directors
47+
# POST /directors.json
48+
def create
49+
@director = Director.new(params[:director])
50+
51+
respond_to do |format|
52+
if @director.save
53+
format.html { redirect_to @director, notice: 'Director was successfully created.' }
54+
format.json { render json: @director, status: :created, location: @director }
55+
else
56+
format.html { render action: "new" }
57+
format.json { render json: @director.errors, status: :unprocessable_entity }
58+
end
59+
end
60+
end
61+
62+
# PUT /directors/1
63+
# PUT /directors/1.json
64+
def update
65+
@director = Director.find(params[:id])
66+
67+
respond_to do |format|
68+
if @director.update_attributes(params[:director])
69+
format.html { redirect_to @director, notice: 'Director was successfully updated.' }
70+
format.json { head :no_content }
71+
else
72+
format.html { render action: "edit" }
73+
format.json { render json: @director.errors, status: :unprocessable_entity }
74+
end
75+
end
76+
end
77+
78+
# DELETE /directors/1
79+
# DELETE /directors/1.json
80+
def destroy
81+
@director = Director.find(params[:id])
82+
@director.destroy
83+
84+
respond_to do |format|
85+
format.html { redirect_to directors_url }
86+
format.json { head :no_content }
87+
end
88+
end
89+
end

app/controllers/movies_controller.rb

+17
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ def index
1616
@actors = []
1717
Actor.order(:lastname, :firstname).each {|actor| @actors.push(actor.name)}
1818

19+
@directors = []
20+
Director.order(:lastname, :firstname).each {|director| @directors.push(director.name)}
21+
1922
@genres = [""]
2023
Genre.order(:name).each {|genre| @genres.push(genre.name)}
2124

@@ -73,6 +76,13 @@ def create
7376
else
7477
params[:movie][:genres] = []
7578
end
79+
if params[:movie][:directors]
80+
params[:movie][:directors].map!{ |id|
81+
Director.find(id)
82+
}
83+
else
84+
params[:movie][:directors] = []
85+
end
7686
@movie = Movie.new(params[:movie])
7787

7888
respond_to do |format|
@@ -104,6 +114,13 @@ def update
104114
else
105115
params[:movie][:genres] = []
106116
end
117+
if params[:movie][:directors]
118+
params[:movie][:directors].map!{ |id|
119+
Director.find(id)
120+
}
121+
else
122+
params[:movie][:directors] = []
123+
end
107124

108125
respond_to do |format|
109126
if @movie.update_attributes(params[:movie])

app/helpers/directors_helper.rb

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
module DirectorsHelper
2+
end

app/models/director.rb

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Director < ActiveRecord::Base
2+
attr_accessible :firstname, :lastname
3+
4+
validates :lastname, :presence => true
5+
6+
has_many :directors_movies, :dependent => :destroy
7+
has_many :movies, :through => :directors_movies
8+
9+
# Outputs the actor's name in the format 'firstname lastname'
10+
def name
11+
"#{firstname} #{lastname}"
12+
end
13+
end

app/models/directors_movie.rb

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class DirectorsMovie < ActiveRecord::Base
2+
attr_accessible :director_id, :movie_id
3+
belongs_to :director
4+
belongs_to :movie
5+
end

app/models/movie.rb

+10
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ class Movie < ActiveRecord::Base
77
has_many :actors, :through => :actors_movies
88
has_many :genres_movies, :dependent => :destroy
99
has_many :genres, :through => :genres_movies
10+
has_many :directors_movies, :dependent => :destroy
11+
has_many :directors, :through => :directors_movies
1012

1113
has_many :views, :dependent => :destroy
1214

@@ -90,6 +92,14 @@ def self.search(q, sort, filters)
9092
else
9193
value.each {|i, val| nmovies.keep_if {|movie| movie.actors.index {|actor| actor.firstname + " " + actor.lastname == val }}}
9294
end
95+
elsif name == "director"
96+
if value.kind_of? String
97+
nmovies.keep_if {|movie| movie.directors.index {|director| director.firstname + " " + director.lastname == value}}
98+
elsif value.kind_of? Array
99+
value.each {|val| nmovies.keep_if {|movie| movie.directors.index {|director| director.firstname + " " + director.lastname == val }}}
100+
else
101+
value.each {|i, val| nmovies.keep_if {|movie| movie.directors.index {|director| director.firstname + " " + director.lastname == val }}}
102+
end
93103
elsif name == "genre"
94104
nmovies.keep_if {|movie| movie.genres.index {|genre| genre.name == value}}
95105
elsif sortables[name] == :year

app/views/directors/_form.html.erb

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<%= form_for(@director) do |director_form| %>
2+
<% if @director.errors.any? %>
3+
<div id="error_explanation" class="ui-widget ui-state-error ui-corner-all" style="padding: 0 .7em;">
4+
<span class="ui-icon ui-icon-alert" style="float: left; margin-right: 0.3em;">&nbsp;</span>
5+
<strong><%= pluralize(@director.errors.count, "error") %> prohibited this director from being saved:</strong>
6+
7+
<ul>
8+
<% @director.errors.full_messages.each do |msg| %>
9+
<li><%= msg %></li>
10+
<% end %>
11+
</ul>
12+
</div>
13+
<% end %>
14+
15+
<div class="field">
16+
<%= director_form.label :firstname, 'First Name:' %>
17+
<%= director_form.text_field :firstname %>
18+
</div>
19+
<div class="field">
20+
<%= director_form.label :lastname, 'Last Name:' %>
21+
<%= director_form.text_field :lastname %>
22+
</div>
23+
24+
<div class="actions">
25+
<%= director_form.submit %>
26+
</div>
27+
<% end %>

app/views/directors/edit.html.erb

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<%= content_for :title do %>
2+
Editing <%= @director.name %>
3+
<% end %>
4+
5+
<%= content_for :options do %>
6+
<%= link_to 'Back', back_url %>
7+
<%= link_to 'Show', @director %>
8+
<% end %>
9+
10+
<article class="person">
11+
<%= render 'form' %>
12+
</article>

app/views/directors/index.html.erb

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<%= content_for :title do %>
2+
Directors
3+
<% end %>
4+
5+
<%= content_for :options do %>
6+
<%= link_to 'New Director', new_director_path %>
7+
<% end %>
8+
9+
<form action="" method="GET" role="search" onsubmit="return q.value != ''">
10+
<input id="searchbar" type="text" name="q" placeholder="Search..." <% if defined? @search %>value="<%= @search %>"<% end %> />
11+
<button title="Search" id="searchbtn" type="submit" class="ui-button-icon-only"><span style="display: inline-block" class="ui-icon ui-icon-search"></span></button>
12+
</form>
13+
<% @directors.each do |director| %>
14+
<article class="person">
15+
<a href="<%= url_for director %>"><h2><%= director.name %></h2></a>
16+
<%= link_to 'Edit', edit_director_path(director), :class => "btn-edit ui-icon ui-icon-pencil", :title => 'Edit' %>
17+
<%= link_to 'Destroy', director, method: :delete, data: { confirm: "Do you want to permanently delete the director #{director.name}?" }, :class => "btn-delete ui-icon ui-icon-closethick", :title => 'Delete' %>
18+
</article>
19+
<% end %>

app/views/directors/new.html.erb

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<%= content_for :title do %>
2+
New director
3+
<% end %>
4+
5+
<%= content_for :options do %>
6+
<%= link_to 'Back', back_url %>
7+
<% end %>
8+
9+
<article class="person">
10+
<%= render 'form' %>
11+
</article>

app/views/directors/show.html.erb

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<%= content_for :title do %>
2+
<%= @director.name %>
3+
<% end %>
4+
5+
<%= content_for :options do %>
6+
<%= link_to 'Back', back_url %>
7+
<%= link_to 'Edit', edit_director_path(@director) %>
8+
<%= link_to 'Delete', @director, method: :delete, data: { confirm: "Do you want to permanently delete the director #{@director.name}?" } %>
9+
<% end %>
10+
11+
<p id="notice"><%= notice %></p>
12+
13+
<article class="person">
14+
<h2><%= @director.name %></h2>
15+
16+
<% @director.movies.sort! { |a,b| a.title.downcase <=> b.title.downcase } %>
17+
<% @director.movies.each do |movie| %>
18+
<article class="<%= movie.dvd == 1 ? "dvd" : "video" %>">
19+
<a href="<%= url_for movie %>"><h2><%= movie.display_name %> <%= movie.yearstring %></h2></a>
20+
<%= link_to 'Edit', edit_movie_path(movie), :class => "btn-edit ui-icon ui-icon-pencil", :title => 'Edit' %>
21+
<%= link_to 'Delete', movie, method: :delete, data: { confirm: "Do you want to permanently delete the movie #{movie.display_name}?" }, :class => "btn-delete ui-icon ui-icon-closethick", :title => 'Delete' %>
22+
<% if movie.lastWatched %>
23+
<p>Last Watched: <span class="lastwatched"><%= movie.lastWatched %></span></p>
24+
<% end %>
25+
<p>Duration: <span><%= movie.duration %><% if movie.duration %> minutes<% end %></span></p>
26+
<div>
27+
<% movie.genres.each do |genre| %>
28+
<%= link_to genre.name, genre, :class => "genre" %>
29+
<% end %>
30+
</div>
31+
</article>
32+
<% end %>
33+
</article>

app/views/layouts/application.html.erb

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<%= link_to "Actors", actors_path %>
1616
<%= link_to "Genres", genres_path %>
1717
<%= link_to "Views", views_path %>
18+
<%= link_to "Directors", directors_path %>
1819
<%= link_to "Random", random_movies_path %>
1920
</nav>
2021
</hgroup>

app/views/layouts/home.html.erb

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<%= link_to "Actors", actors_path %>
1616
<%= link_to "Genres", genres_path %>
1717
<%= link_to "Views", views_path %>
18+
<%= link_to "Directors", directors_path %>
1819
<%= link_to "Random", random_movies_path %>
1920
</nav>
2021
</hgroup>

0 commit comments

Comments
 (0)