Skip to content
Open

Wip #10

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions app/controllers/movies_controller.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
class MoviesController < ApplicationController
before_action :set_movie, only: %i[ show edit update destroy ]

before_action :set_movie, only: %i[
show
edit
update
destroy
edit_title
edit_duration
edit_year
edit_description
edit_director_id
]
# GET /movies or /movies.json
def index
@movies = Movie.all
Expand All @@ -27,6 +36,7 @@ def create
if @movie.save
format.html { redirect_to @movie, notice: "Movie was successfully created." }
format.json { render :show, status: :created, location: @movie }
format.js
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @movie.errors, status: :unprocessable_entity }
Expand All @@ -40,6 +50,7 @@ def update
if @movie.update(movie_params)
format.html { redirect_to @movie, notice: "Movie was successfully updated." }
format.json { render :show, status: :ok, location: @movie }
format.js
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @movie.errors, status: :unprocessable_entity }
Expand All @@ -53,13 +64,15 @@ def destroy
respond_to do |format|
format.html { redirect_to movies_url, notice: "Movie was successfully destroyed." }
format.json { head :no_content }
format.js
end
end

private
# Use callbacks to share common setup or constraints between actions.
def set_movie
@movie = Movie.find(params[:id])
movie_id = params[:id] || params[:movie_id]
@movie = Movie.find(movie_id)
end

# Only allow a list of trusted parameters through.
Expand Down
2 changes: 2 additions & 0 deletions app/models/actor.rb
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
class Actor < ApplicationRecord
has_many :characters
has_many :movies, through: :character
end
1 change: 1 addition & 0 deletions app/models/director.rb
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
class Director < ApplicationRecord
has_many :movies
end
2 changes: 2 additions & 0 deletions app/models/movie.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
class Movie < ApplicationRecord
belongs_to :director
has_many :characters, dependent: :destroy
has_many :actors, through: :character
end
4 changes: 4 additions & 0 deletions app/views/layouts/application.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@

<%= stylesheet_link_tag 'application', media: 'all' %>
<%= javascript_pack_tag 'application' %>
<script
src="https://code.jquery.com/jquery-3.6.0.min.js"
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
crossorigin="anonymous"></script>
</head>

<body>
Expand Down
21 changes: 21 additions & 0 deletions app/views/movies/_movie.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<tr id="<%= dom_id(movie) %>">
<td>
<%= render "movies/movie/title", movie: movie %>
</td>
<td>
<%= render "movies/movie/year", movie: movie %>
</td>
<td>
<%= render "movies/movie/director_id", movie: movie %>
</td>
<td>
<%= render "movies/movie/description", movie: movie %>
</td>
<td>
<%= render "movies/movie/duration", movie: movie %>
</td>

<td>
<%= link_to 'Destroy', movie, method: :delete, remote: true %>
</td>
</tr>
3 changes: 3 additions & 0 deletions app/views/movies/create.js.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
$("#movies").prepend("<%= j(render @movie)%>");

$("#new_movie_form").trigger("reset");
3 changes: 3 additions & 0 deletions app/views/movies/destroy.js.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
$("#<%= dom_id(@movie) %>").fadeOut(function() {
$(this).remove();
});
1 change: 1 addition & 0 deletions app/views/movies/edit_description.js.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
$("#<%= dom_id(@movie) %>_description").replaceWith("<%= j(render "movies/forms/description", movie: @movie)%>");
1 change: 1 addition & 0 deletions app/views/movies/edit_director_id.js.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
$("#<%= dom_id(@movie) %>_director_id").replaceWith("<%= j(render "movies/forms/director_id", movie: @movie)%>");
1 change: 1 addition & 0 deletions app/views/movies/edit_duration.js.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
$("#<%= dom_id(@movie) %>_duration").replaceWith("<%= j(render "movies/forms/duration", movie: @movie)%>");
1 change: 1 addition & 0 deletions app/views/movies/edit_title.js.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
$("#<%= dom_id(@movie) %>_title").replaceWith("<%= j(render "movies/forms/title", movie: @movie)%>");
1 change: 1 addition & 0 deletions app/views/movies/edit_year.js.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
$("#<%= dom_id(@movie) %>_year").replaceWith("<%= j(render "movies/forms/year", movie: @movie)%>");
10 changes: 10 additions & 0 deletions app/views/movies/forms/_description.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<div id="<%= dom_id(movie) %>_description_form">
<%= form_with(model: movie, local: false) do |form| %>
<div class="field">
<%= form.label :description, for: "#{dom_id(movie)}_description" %>
<%= form.text_area :description, id: "#{dom_id(movie)}_description" %>
</div>

<%= form.submit %>
<% end %>
</div>
8 changes: 8 additions & 0 deletions app/views/movies/forms/_director_id.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div id="<%= dom_id(movie) %>_director_id_form">
<%= form_with(model: movie, local: false) do |form| %>
<div class="field">
<%= form.label :director_id, for: "#{dom_id(movie)}_director_id" %>
<%= form.collection_select :director_id, Director.order(:name), :id, :name, {}, onchange: 'Rails.fire(this.form, "submit")', id: "#{dom_id(movie)}_director_id" %>
</div>
<% end %>
</div>
8 changes: 8 additions & 0 deletions app/views/movies/forms/_duration.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div id="<%= dom_id(movie) %>_duration_form">
<%= form_with(model: movie, local: false) do |form| %>
<div class="field">
<%= form.label :duration, for: "#{dom_id(movie)}_duration" %>
<%= form.text_field :duration, id: "#{dom_id(movie)}_duration" %>
</div>
<% end %>
</div>
8 changes: 8 additions & 0 deletions app/views/movies/forms/_title.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div id="<%= dom_id(movie) %>_title_form">
<%= form_with(model: movie, local: false) do |form| %>
<div class="field">
<%= form.label :title, for: "#{dom_id(movie)}_title" %>
<%= form.text_field :title, id: "#{dom_id(movie)}_title" %>
</div>
<% end %>
</div>
8 changes: 8 additions & 0 deletions app/views/movies/forms/_year.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div id="<%= dom_id(movie) %>_year_form">
<%= form_with(model: movie, local: false) do |form| %>
<div class="field">
<%= form.label :year, for: "#{dom_id(movie)}_year" %>
<%= form.text_field :year, id: "#{dom_id(movie)}_year" %>
</div>
<% end %>
</div>
56 changes: 37 additions & 19 deletions app/views/movies/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -6,30 +6,48 @@
<thead>
<tr>
<th>Title</th>
<th>Description</th>
<th>Duration</th>
<th>Year</th>
<th>Director</th>
<th>Description</th>
<th>Duration</th>
<th colspan="3"></th>
</tr>
</thead>

<tbody>
<% @movies.each do |movie| %>
<tr>
<td><%= movie.title %></td>
<td><%= movie.description %></td>
<td><%= movie.duration %></td>
<td><%= movie.year %></td>
<td><%= movie.director_id %></td>
<td><%= link_to 'Show', movie %></td>
<td><%= link_to 'Edit', edit_movie_path(movie) %></td>
<td><%= link_to 'Destroy', movie, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<%= form_with(model: Movie.new, local: false, id: "new_movie_form") do |form| %>
<tr>
<td>
<%= form.label :title %>
<%= form.text_field :title %>
</td>

<br>
<td>
<%= form.label :year %>
<%= form.number_field :year %>
</td>

<%= link_to 'New Movie', new_movie_path %>
<td>
<%= form.label :director_id %>
<%= form.collection_select :director_id, Director.order(:name), :id, :name %>
</td>

<td>
<%= form.label :description %>
<%= form.text_area :description %>
</td>

<td>
<%= form.label :duration %>
<%= form.number_field :duration %>
</td>

<td class="actions">
<%= form.submit %>
</td>
</tr>
<% end %>

<tbody id="movies">
<%= render @movies.order(created_at: :desc, id: :desc) %>
</tbody>
</table>
18 changes: 18 additions & 0 deletions app/views/movies/movie/_description.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<div id="<%= dom_id(movie) %>_description">
<% if movie.description.blank? %>
<%= link_to movie_edit_description_path(movie), remote: true do %>
Add description
<% end %>
<% else %>
<details>
<summary>
Show description
</summary>

<%= simple_format movie.description %>
<%= link_to movie_edit_description_path(movie), remote: true do %>
Edit
<% end %>
</details>
<% end %>
</div>
9 changes: 9 additions & 0 deletions app/views/movies/movie/_director_id.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<div id="<%= dom_id(movie) %>_director_id">
<%= link_to movie_edit_director_id_path(movie), remote: true do %>
<% if movie.director.present? %>
<%= movie.director.name %>
<% else %>
Add director
<% end %>
<% end %>
</div>
9 changes: 9 additions & 0 deletions app/views/movies/movie/_duration.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<div id="<%= dom_id(movie) %>_duration">
<%= link_to movie_edit_duration_path(movie), remote: true do %>
<% if movie.duration.present? %>
<%= movie.duration %> minutes
<% else %>
Add duration
<% end %>
<% end %>
</div>
9 changes: 9 additions & 0 deletions app/views/movies/movie/_title.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<div id="<%= dom_id(movie) %>_title">
<%= link_to movie_edit_title_path(movie), remote: true do %>
<% if movie.title.present? %>
<%= movie.title %>
<% else %>
Add title
<% end %>
<% end %>
</div>
9 changes: 9 additions & 0 deletions app/views/movies/movie/_year.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<div id="<%= dom_id(movie) %>_year">
<%= link_to movie_edit_year_path(movie), remote: true do %>
<% if movie.year.present? %>
<%= movie.year %>
<% else %>
Add year
<% end %>
<% end %>
</div>
16 changes: 8 additions & 8 deletions app/views/movies/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,23 @@
</p>

<p>
<strong>Description:</strong>
<%= @movie.description %>
<strong>Year:</strong>
<%= @movie.year %>
</p>

<p>
<strong>Duration:</strong>
<%= @movie.duration %>
<strong>Director:</strong>
<%= @movie.director_id %>
</p>

<p>
<strong>Year:</strong>
<%= @movie.year %>
<strong>Description:</strong>
<%= @movie.description %>
</p>

<p>
<strong>Director:</strong>
<%= @movie.director_id %>
<strong>Duration:</strong>
<%= @movie.duration %>
</p>

<%= link_to 'Edit', edit_movie_path(@movie) %> |
Expand Down
3 changes: 3 additions & 0 deletions app/views/movies/update.js.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<% @movie.saved_changes.keys.reject { |v| v == "updated_at" }.each do |changed_attribute| %>
$("#<%= dom_id(@movie) %>_<%= changed_attribute %>_form").replaceWith("<%= j(render "movies/movie/#{changed_attribute}", movie: @movie) %>");
<% end %>
28 changes: 24 additions & 4 deletions config/routes.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,28 @@
Rails.application.routes.draw do
root "movies#index"

resources :characters
resources :actors
resources :directors
resources :movies
resources :characters do
get "actor_id", as: :edit_actor_id
get "movie_id", as: :edit_movie_id
end

resources :actors do
get "name/edit", as: :edit_name
get "bio/edit", as: :edit_bio
get "dob/edit", as: :edit_dob
end

resources :directors do
get "name/edit", as: :edit_name
get "bio/edit", as: :edit_bio
get "dob/edit", as: :edit_dob
end

resources :movies do
get "title/edit" => "movies#edit_title", as: :edit_title
get "description/edit" => "movies#edit_description", as: :edit_description
get "duration/edit" => "movies#edit_duration", as: :edit_duration
get "year/edit" => "movies#edit_year", as: :edit_year
get "director_id/edit" => "movies#edit_director_id", as: :edit_director_id
end
end