From eb491caffcf7d9735a36dc8a27ba015ab329059d Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Mon, 22 Apr 2019 14:24:54 -0700 Subject: [PATCH 01/59] new rails --- .gitignore | 27 ++ .ruby-version | 1 + Gemfile | 81 +++++ Gemfile.lock | 279 ++++++++++++++++++ Guardfile | 9 + Rakefile | 6 + app/assets/config/manifest.js | 3 + app/assets/images/.keep | 0 app/assets/javascripts/application.js | 19 ++ app/assets/javascripts/cable.js | 13 + app/assets/javascripts/channels/.keep | 0 app/assets/stylesheets/application.scss | 17 ++ app/channels/application_cable/channel.rb | 4 + app/channels/application_cable/connection.rb | 4 + app/controllers/application_controller.rb | 2 + app/controllers/concerns/.keep | 0 app/helpers/application_helper.rb | 2 + app/jobs/application_job.rb | 2 + app/mailers/application_mailer.rb | 4 + app/models/application_record.rb | 3 + app/models/concerns/.keep | 0 app/views/layouts/application.html.erb | 15 + app/views/layouts/mailer.html.erb | 13 + app/views/layouts/mailer.text.erb | 1 + bin/bundle | 3 + bin/rails | 9 + bin/rake | 9 + bin/setup | 36 +++ bin/spring | 17 ++ bin/update | 31 ++ bin/yarn | 11 + config.ru | 5 + config/application.rb | 25 ++ config/boot.rb | 4 + config/cable.yml | 10 + config/credentials.yml.enc | 1 + config/database.yml | 85 ++++++ config/environment.rb | 5 + config/environments/development.rb | 61 ++++ config/environments/production.rb | 94 ++++++ config/environments/test.rb | 46 +++ config/initializers/action_view.rb | 1 + .../application_controller_renderer.rb | 8 + config/initializers/assets.rb | 14 + config/initializers/backtrace_silencers.rb | 7 + .../initializers/content_security_policy.rb | 25 ++ config/initializers/cookies_serializer.rb | 5 + .../initializers/filter_parameter_logging.rb | 4 + config/initializers/inflections.rb | 16 + config/initializers/mime_types.rb | 4 + config/initializers/wrap_parameters.rb | 14 + config/locales/en.yml | 33 +++ config/puma.rb | 34 +++ config/routes.rb | 3 + config/spring.rb | 6 + config/storage.yml | 34 +++ db/seeds.rb | 7 + lib/assets/.keep | 0 lib/tasks/.keep | 0 log/.keep | 0 package.json | 5 + public/404.html | 67 +++++ public/422.html | 67 +++++ public/500.html | 66 +++++ public/apple-touch-icon-precomposed.png | 0 public/apple-touch-icon.png | 0 public/favicon.ico | 0 public/robots.txt | 1 + storage/.keep | 0 test/application_system_test_case.rb | 5 + test/controllers/.keep | 0 test/fixtures/.keep | 0 test/fixtures/files/.keep | 0 test/helpers/.keep | 0 test/integration/.keep | 0 test/mailers/.keep | 0 test/models/.keep | 0 test/system/.keep | 0 test/test_helper.rb | 24 ++ tmp/.keep | 0 vendor/.keep | 0 81 files changed, 1407 insertions(+) create mode 100644 .gitignore create mode 100644 .ruby-version create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Guardfile create mode 100644 Rakefile create mode 100644 app/assets/config/manifest.js create mode 100644 app/assets/images/.keep create mode 100644 app/assets/javascripts/application.js create mode 100644 app/assets/javascripts/cable.js create mode 100644 app/assets/javascripts/channels/.keep create mode 100644 app/assets/stylesheets/application.scss create mode 100644 app/channels/application_cable/channel.rb create mode 100644 app/channels/application_cable/connection.rb create mode 100644 app/controllers/application_controller.rb create mode 100644 app/controllers/concerns/.keep create mode 100644 app/helpers/application_helper.rb create mode 100644 app/jobs/application_job.rb create mode 100644 app/mailers/application_mailer.rb create mode 100644 app/models/application_record.rb create mode 100644 app/models/concerns/.keep create mode 100644 app/views/layouts/application.html.erb create mode 100644 app/views/layouts/mailer.html.erb create mode 100644 app/views/layouts/mailer.text.erb create mode 100755 bin/bundle create mode 100755 bin/rails create mode 100755 bin/rake create mode 100755 bin/setup create mode 100755 bin/spring create mode 100755 bin/update create mode 100755 bin/yarn create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/cable.yml create mode 100644 config/credentials.yml.enc create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/action_view.rb create mode 100644 config/initializers/application_controller_renderer.rb create mode 100644 config/initializers/assets.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/content_security_policy.rb create mode 100644 config/initializers/cookies_serializer.rb create mode 100644 config/initializers/filter_parameter_logging.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/en.yml create mode 100644 config/puma.rb create mode 100644 config/routes.rb create mode 100644 config/spring.rb create mode 100644 config/storage.yml create mode 100644 db/seeds.rb create mode 100644 lib/assets/.keep create mode 100644 lib/tasks/.keep create mode 100644 log/.keep create mode 100644 package.json create mode 100644 public/404.html create mode 100644 public/422.html create mode 100644 public/500.html create mode 100644 public/apple-touch-icon-precomposed.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon.ico create mode 100644 public/robots.txt create mode 100644 storage/.keep create mode 100644 test/application_system_test_case.rb create mode 100644 test/controllers/.keep create mode 100644 test/fixtures/.keep create mode 100644 test/fixtures/files/.keep create mode 100644 test/helpers/.keep create mode 100644 test/integration/.keep create mode 100644 test/mailers/.keep create mode 100644 test/models/.keep create mode 100644 test/system/.keep create mode 100644 test/test_helper.rb create mode 100644 tmp/.keep create mode 100644 vendor/.keep diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..18b43c9cd2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore uploaded files in development +/storage/* +!/storage/.keep + +/node_modules +/yarn-error.log + +/public/assets +.byebug_history + +# Ignore master key for decrypting credentials and more. +/config/master.key diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000000..25c81fe399 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +ruby-2.5.1 \ No newline at end of file diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000000..80be142348 --- /dev/null +++ b/Gemfile @@ -0,0 +1,81 @@ +source 'https://rubygems.org' +git_source(:github) { |repo| "https://github.com/#{repo}.git" } + +ruby '2.5.1' + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 5.2.3' +# Use postgresql as the database for Active Record +gem 'pg', '>= 0.18', '< 2.0' +# Use Puma as the app server +gem 'puma', '~> 3.11' +# Use SCSS for stylesheets +gem 'sass-rails', '~> 5.0' +# Use Uglifier as compressor for JavaScript assets +gem 'uglifier', '>= 1.3.0' +# See https://github.com/rails/execjs#readme for more supported runtimes +# gem 'mini_racer', platforms: :ruby + +# Use CoffeeScript for .coffee assets and views +# gem 'coffee-rails', '~> 4.2' +# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks +gem 'turbolinks', '~> 5' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +gem 'jbuilder', '~> 2.5' +# Use Redis adapter to run Action Cable in production +# gem 'redis', '~> 4.0' +# Use ActiveModel has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use ActiveStorage variant +# gem 'mini_magick', '~> 4.8' + +# Use Capistrano for deployment +# gem 'capistrano-rails', group: :development + +# Reduces boot times through caching; required in config/boot.rb +gem 'bootsnap', '>= 1.1.0', require: false + +group :development, :test do + # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] +end + +group :development do + # Access an interactive console on exception pages or by calling 'console' anywhere in the code. + gem 'web-console', '>= 3.3.0' + gem 'listen', '>= 3.0.5', '< 3.2' + # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem 'spring' + gem 'spring-watcher-listen', '~> 2.0.0' +end + +group :test do + # Adds support for Capybara system testing and selenium driver + gem 'capybara', '>= 2.15' + gem 'selenium-webdriver' + # Easy installation and use of chromedriver to run system tests with Chrome + gem 'chromedriver-helper' +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +gem 'jquery-rails' +gem 'jquery-turbolinks' +gem 'bootstrap', '~> 4.1.3' +group :development, :test do + gem 'pry-rails' +end + +group :development do + gem 'better_errors' + gem 'binding_of_caller' + gem 'guard' + gem 'guard-minitest' +end + +group :test do + gem 'minitest-rails' + gem 'minitest-reporters' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000000..800e2e5b40 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,279 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (5.2.3) + actionpack (= 5.2.3) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailer (5.2.3) + actionpack (= 5.2.3) + actionview (= 5.2.3) + activejob (= 5.2.3) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (5.2.3) + actionview (= 5.2.3) + activesupport (= 5.2.3) + rack (~> 2.0) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.2.3) + activesupport (= 5.2.3) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.2.3) + activesupport (= 5.2.3) + globalid (>= 0.3.6) + activemodel (5.2.3) + activesupport (= 5.2.3) + activerecord (5.2.3) + activemodel (= 5.2.3) + activesupport (= 5.2.3) + arel (>= 9.0) + activestorage (5.2.3) + actionpack (= 5.2.3) + activerecord (= 5.2.3) + marcel (~> 0.3.1) + activesupport (5.2.3) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + addressable (2.6.0) + public_suffix (>= 2.0.2, < 4.0) + ansi (1.5.0) + archive-zip (0.12.0) + io-like (~> 0.3.0) + arel (9.0.0) + autoprefixer-rails (9.5.1) + execjs + better_errors (2.5.1) + coderay (>= 1.0.0) + erubi (>= 1.0.0) + rack (>= 0.9.0) + bindex (0.7.0) + binding_of_caller (0.8.0) + debug_inspector (>= 0.0.1) + bootsnap (1.4.3) + msgpack (~> 1.0) + bootstrap (4.1.3) + autoprefixer-rails (>= 6.0.3) + popper_js (>= 1.12.9, < 2) + sass (>= 3.5.2) + builder (3.2.3) + byebug (11.0.1) + capybara (3.18.0) + addressable + mini_mime (>= 0.1.3) + nokogiri (~> 1.8) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + regexp_parser (~> 1.2) + xpath (~> 3.2) + childprocess (1.0.1) + rake (< 13.0) + chromedriver-helper (2.1.1) + archive-zip (~> 0.10) + nokogiri (~> 1.8) + coderay (1.1.2) + concurrent-ruby (1.1.5) + crass (1.0.4) + debug_inspector (0.0.3) + erubi (1.8.0) + execjs (2.7.0) + ffi (1.10.0) + formatador (0.2.5) + globalid (0.4.2) + activesupport (>= 4.2.0) + guard (2.15.0) + formatador (>= 0.2.4) + listen (>= 2.7, < 4.0) + lumberjack (>= 1.0.12, < 2.0) + nenv (~> 0.1) + notiffany (~> 0.0) + pry (>= 0.9.12) + shellany (~> 0.0) + thor (>= 0.18.1) + guard-compat (1.2.1) + guard-minitest (2.4.6) + guard-compat (~> 1.2) + minitest (>= 3.0) + i18n (1.6.0) + concurrent-ruby (~> 1.0) + io-like (0.3.0) + jbuilder (2.8.0) + activesupport (>= 4.2.0) + multi_json (>= 1.2) + jquery-rails (4.3.3) + rails-dom-testing (>= 1, < 3) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) + jquery-turbolinks (2.1.0) + railties (>= 3.1.0) + turbolinks + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + loofah (2.2.3) + crass (~> 1.0.2) + nokogiri (>= 1.5.9) + lumberjack (1.0.13) + mail (2.7.1) + mini_mime (>= 0.1.1) + marcel (0.3.3) + mimemagic (~> 0.3.2) + method_source (0.9.2) + mimemagic (0.3.3) + mini_mime (1.0.1) + mini_portile2 (2.4.0) + minitest (5.11.3) + minitest-rails (3.0.0) + minitest (~> 5.8) + railties (~> 5.0) + minitest-reporters (1.3.6) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + msgpack (1.2.10) + multi_json (1.13.1) + nenv (0.3.0) + nio4r (2.3.1) + nokogiri (1.10.3) + mini_portile2 (~> 2.4.0) + notiffany (0.1.1) + nenv (~> 0.1) + shellany (~> 0.0) + pg (1.1.4) + popper_js (1.14.5) + pry (0.12.2) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + pry-rails (0.3.9) + pry (>= 0.10.4) + public_suffix (3.0.3) + puma (3.12.1) + rack (2.0.7) + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (5.2.3) + actioncable (= 5.2.3) + actionmailer (= 5.2.3) + actionpack (= 5.2.3) + actionview (= 5.2.3) + activejob (= 5.2.3) + activemodel (= 5.2.3) + activerecord (= 5.2.3) + activestorage (= 5.2.3) + activesupport (= 5.2.3) + bundler (>= 1.3.0) + railties (= 5.2.3) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.0.4) + loofah (~> 2.2, >= 2.2.2) + railties (5.2.3) + actionpack (= 5.2.3) + activesupport (= 5.2.3) + method_source + rake (>= 0.8.7) + thor (>= 0.19.0, < 2.0) + rake (12.3.2) + rb-fsevent (0.10.3) + rb-inotify (0.10.0) + ffi (~> 1.0) + regexp_parser (1.4.0) + ruby-progressbar (1.10.0) + ruby_dep (1.5.0) + rubyzip (1.2.2) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sass-rails (5.0.7) + railties (>= 4.0.0, < 6) + sass (~> 3.1) + sprockets (>= 2.8, < 4.0) + sprockets-rails (>= 2.0, < 4.0) + tilt (>= 1.1, < 3) + selenium-webdriver (3.141.5926) + childprocess (>= 0.5, < 2.0) + rubyzip (~> 1.2, >= 1.2.2) + shellany (0.0.1) + spring (2.0.2) + activesupport (>= 4.2) + spring-watcher-listen (2.0.1) + listen (>= 2.7, < 4.0) + spring (>= 1.2, < 3.0) + sprockets (3.7.2) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.1) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + thor (0.20.3) + thread_safe (0.3.6) + tilt (2.0.9) + turbolinks (5.2.0) + turbolinks-source (~> 5.2) + turbolinks-source (5.2.0) + tzinfo (1.2.5) + thread_safe (~> 0.1) + uglifier (4.1.20) + execjs (>= 0.3.0, < 3) + web-console (3.7.0) + actionview (>= 5.0) + activemodel (>= 5.0) + bindex (>= 0.4.0) + railties (>= 5.0) + websocket-driver (0.7.0) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.3) + xpath (3.2.0) + nokogiri (~> 1.8) + +PLATFORMS + ruby + +DEPENDENCIES + better_errors + binding_of_caller + bootsnap (>= 1.1.0) + bootstrap (~> 4.1.3) + byebug + capybara (>= 2.15) + chromedriver-helper + guard + guard-minitest + jbuilder (~> 2.5) + jquery-rails + jquery-turbolinks + listen (>= 3.0.5, < 3.2) + minitest-rails + minitest-reporters + pg (>= 0.18, < 2.0) + pry-rails + puma (~> 3.11) + rails (~> 5.2.3) + sass-rails (~> 5.0) + selenium-webdriver + spring + spring-watcher-listen (~> 2.0.0) + turbolinks (~> 5) + tzinfo-data + uglifier (>= 1.3.0) + web-console (>= 3.3.0) + +RUBY VERSION + ruby 2.5.1p57 + +BUNDLED WITH + 2.0.1 diff --git a/Guardfile b/Guardfile new file mode 100644 index 0000000000..e34f706f4a --- /dev/null +++ b/Guardfile @@ -0,0 +1,9 @@ +guard :minitest, autorun: false, spring: true do + watch(%r{^app/(.+).rb$}) { |m| "test/#{m[1]}_test.rb" } + watch(%r{^app/controllers/application_controller.rb$}) { 'test/controllers' } + watch(%r{^app/controllers/(.+)_controller.rb$}) { |m| "test/integration/#{m[1]}_test.rb" } + watch(%r{^app/views/(.+)_mailer/.+}) { |m| "test/mailers/#{m[1]}_mailer_test.rb" } + watch(%r{^lib/(.+).rb$}) { |m| "test/lib/#{m[1]}_test.rb" } + watch(%r{^test/.+_test.rb$}) + watch(%r{^test/test_helper.rb$}) { 'test' } +end diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000000..e85f913914 --- /dev/null +++ b/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require_relative 'config/application' + +Rails.application.load_tasks diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js new file mode 100644 index 0000000000..b16e53d6d5 --- /dev/null +++ b/app/assets/config/manifest.js @@ -0,0 +1,3 @@ +//= link_tree ../images +//= link_directory ../javascripts .js +//= link_directory ../stylesheets .css diff --git a/app/assets/images/.keep b/app/assets/images/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js new file mode 100644 index 0000000000..b0ef35b723 --- /dev/null +++ b/app/assets/javascripts/application.js @@ -0,0 +1,19 @@ +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's +// vendor/assets/javascripts directory can be referenced here using a relative path. +// +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// compiled file. JavaScript code in this file should be added after the last require_* statement. +// +// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details +// about supported directives. //= require jquery3 + //= require popper + //= require bootstrap-sprockets + +// +//= require rails-ujs +//= require activestorage +//= require turbolinks +//= require_tree . diff --git a/app/assets/javascripts/cable.js b/app/assets/javascripts/cable.js new file mode 100644 index 0000000000..739aa5f022 --- /dev/null +++ b/app/assets/javascripts/cable.js @@ -0,0 +1,13 @@ +// Action Cable provides the framework to deal with WebSockets in Rails. +// You can generate new channels where WebSocket features live using the `rails generate channel` command. +// +//= require action_cable +//= require_self +//= require_tree ./channels + +(function() { + this.App || (this.App = {}); + + App.cable = ActionCable.createConsumer(); + +}).call(this); diff --git a/app/assets/javascripts/channels/.keep b/app/assets/javascripts/channels/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss new file mode 100644 index 0000000000..b4d20f5641 --- /dev/null +++ b/app/assets/stylesheets/application.scss @@ -0,0 +1,17 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's + * vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS + * files in this directory. Styles in this file should be added after the last require_* statement. + * It is generally better to create a new file per style scope. + * + */ +/* Custom bootstrap variables must be set or imported *before* bootstrap. */ +@import "bootstrap"; +/* Import scss content */ +@import "**/*"; diff --git a/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb new file mode 100644 index 0000000000..d672697283 --- /dev/null +++ b/app/channels/application_cable/channel.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Channel < ActionCable::Channel::Base + end +end diff --git a/app/channels/application_cable/connection.rb b/app/channels/application_cable/connection.rb new file mode 100644 index 0000000000..0ff5442f47 --- /dev/null +++ b/app/channels/application_cable/connection.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Connection < ActionCable::Connection::Base + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 0000000000..09705d12ab --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,2 @@ +class ApplicationController < ActionController::Base +end diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 0000000000..de6be7945c --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb new file mode 100644 index 0000000000..a009ace51c --- /dev/null +++ b/app/jobs/application_job.rb @@ -0,0 +1,2 @@ +class ApplicationJob < ActiveJob::Base +end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb new file mode 100644 index 0000000000..286b2239d1 --- /dev/null +++ b/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: 'from@example.com' + layout 'mailer' +end diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 0000000000..10a4cba84d --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb new file mode 100644 index 0000000000..f32268a271 --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,15 @@ + + + + MediaRanker + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> + <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb new file mode 100644 index 0000000000..cbd34d2e9d --- /dev/null +++ b/app/views/layouts/mailer.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb new file mode 100644 index 0000000000..37f0bddbd7 --- /dev/null +++ b/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/bin/bundle b/bin/bundle new file mode 100755 index 0000000000..f19acf5b5c --- /dev/null +++ b/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) +load Gem.bin_path('bundler', 'bundle') diff --git a/bin/rails b/bin/rails new file mode 100755 index 0000000000..5badb2fde0 --- /dev/null +++ b/bin/rails @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +APP_PATH = File.expand_path('../config/application', __dir__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/bin/rake b/bin/rake new file mode 100755 index 0000000000..d87d5f5781 --- /dev/null +++ b/bin/rake @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/bin/setup b/bin/setup new file mode 100755 index 0000000000..94fd4d7977 --- /dev/null +++ b/bin/setup @@ -0,0 +1,36 @@ +#!/usr/bin/env ruby +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # Install JavaScript dependencies if using Yarn + # system('bin/yarn') + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:setup' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/spring b/bin/spring new file mode 100755 index 0000000000..fb2ec2ebb4 --- /dev/null +++ b/bin/spring @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +# This file loads spring without using Bundler, in order to be fast. +# It gets overwritten when you run the `spring binstub` command. + +unless defined?(Spring) + require 'rubygems' + require 'bundler' + + lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) + spring = lockfile.specs.detect { |spec| spec.name == "spring" } + if spring + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem 'spring', spring.version + require 'spring/binstub' + end +end diff --git a/bin/update b/bin/update new file mode 100755 index 0000000000..58bfaed518 --- /dev/null +++ b/bin/update @@ -0,0 +1,31 @@ +#!/usr/bin/env ruby +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a way to update your development environment automatically. + # Add necessary update steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # Install JavaScript dependencies if using Yarn + # system('bin/yarn') + + puts "\n== Updating database ==" + system! 'bin/rails db:migrate' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/yarn b/bin/yarn new file mode 100755 index 0000000000..460dd565b4 --- /dev/null +++ b/bin/yarn @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +APP_ROOT = File.expand_path('..', __dir__) +Dir.chdir(APP_ROOT) do + begin + exec "yarnpkg", *ARGV + rescue Errno::ENOENT + $stderr.puts "Yarn executable was not detected in the system." + $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" + exit 1 + end +end diff --git a/config.ru b/config.ru new file mode 100644 index 0000000000..f7ba0b527b --- /dev/null +++ b/config.ru @@ -0,0 +1,5 @@ +# This file is used by Rack-based servers to start the application. + +require_relative 'config/environment' + +run Rails.application diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 0000000000..08db79cb25 --- /dev/null +++ b/config/application.rb @@ -0,0 +1,25 @@ +require_relative 'boot' + +require 'rails/all' + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module MediaRanker + class Application < Rails::Application + config.generators do |g| + # Force new test files to be generated in the minitest-spec style + g.test_framework :minitest, spec: true + # Always use .js files, never .coffee + g.javascript_engine :js + end + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 5.2 + + # Settings in config/environments/* take precedence over those specified here. + # Application configuration can go into files in config/initializers + # -- all .rb files in that directory are automatically loaded after loading + # the framework and any gems in your application. + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 0000000000..b9e460cef3 --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,4 @@ +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) + +require 'bundler/setup' # Set up gems listed in the Gemfile. +require 'bootsnap/setup' # Speed up boot time by caching expensive operations. diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 0000000000..0b286f676e --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: async + +production: + adapter: redis + url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> + channel_prefix: MediaRanker_production diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc new file mode 100644 index 0000000000..6ff7e245d9 --- /dev/null +++ b/config/credentials.yml.enc @@ -0,0 +1 @@ +2HjjmKMawo0a4rEI8U2Evysg81fOkKYeEuzgM/A9F3g7yGBzZznTRLbdCsH03cPDJEjVG5zvJyi0mdFQtpDZW7mTO2/sGSO9BjOnaQHdauV7UeZtZiKbU6i7jzx472fzkLw9wVnX6ZqxwvtXrOHa8d5jt4u2+LqTNMNSTSE85Ehwfoe/t50LFGQApJM8CPWd+1KXzZv8oYAHF09NRmGGaohx/nIDukXZTtFm4y3qojNQW9TeGabrz/a7/drDLT7DBQugGSEDyD5WkbbdUg9Cvv5ZVrBZaF0keTReT/acgtCrmlau8GCVSiY2I9dyvH02i92EYVLSOt+2VfOb2GtfzANzUwt9BDlmmapz+qvYJhVx9pjdnZ1TBaO2wvOMSShhzAro2iBZqWz4rUgL6Ovj/rKvcVBzDFjzliQ1--zT6aEaSrU8DuoQQ/--tvI9nmFQ4VX6+2TZUsMuoA== \ No newline at end of file diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 0000000000..0bd2511123 --- /dev/null +++ b/config/database.yml @@ -0,0 +1,85 @@ +# PostgreSQL. Versions 9.1 and up are supported. +# +# Install the pg driver: +# gem install pg +# On OS X with Homebrew: +# gem install pg -- --with-pg-config=/usr/local/bin/pg_config +# On OS X with MacPorts: +# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config +# On Windows: +# gem install pg +# Choose the win32 build. +# Install PostgreSQL and put its /bin directory on your path. +# +# Configure Using Gemfile +# gem 'pg' +# +default: &default + adapter: postgresql + encoding: unicode + # For details on connection pooling, see Rails configuration guide + # http://guides.rubyonrails.org/configuring.html#database-pooling + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + +development: + <<: *default + database: MediaRanker_development + + # The specified database role being used to connect to postgres. + # To create additional roles in postgres see `$ createuser --help`. + # When left blank, postgres will use the default role. This is + # the same name as the operating system user that initialized the database. + #username: MediaRanker + + # The password associated with the postgres role (username). + #password: + + # Connect on a TCP socket. Omitted by default since the client uses a + # domain socket that doesn't need configuration. Windows does not have + # domain sockets, so uncomment these lines. + #host: localhost + + # The TCP port the server listens on. Defaults to 5432. + # If your server runs on a different port number, change accordingly. + #port: 5432 + + # Schema search path. The server defaults to $user,public + #schema_search_path: myapp,sharedapp,public + + # Minimum log levels, in increasing order: + # debug5, debug4, debug3, debug2, debug1, + # log, notice, warning, error, fatal, and panic + # Defaults to warning. + #min_messages: notice + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: MediaRanker_test + +# As with config/secrets.yml, you never want to store sensitive information, +# like your database password, in your source code. If your source code is +# ever seen by anyone, they now have access to your database. +# +# Instead, provide the password as a unix environment variable when you boot +# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database +# for a full rundown on how to provide these environment variables in a +# production deployment. +# +# On Heroku and other platform providers, you may have a full connection URL +# available as an environment variable. For example: +# +# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" +# +# You can use this database configuration with: +# +# production: +# url: <%= ENV['DATABASE_URL'] %> +# +production: + <<: *default + database: MediaRanker_production + username: MediaRanker + password: <%= ENV['MEDIARANKER_DATABASE_PASSWORD'] %> diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 0000000000..426333bb46 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative 'application' + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 0000000000..1311e3e4ef --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,61 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + # Run rails dev:cache to toggle caching. + if Rails.root.join('tmp', 'caching-dev.txt').exist? + config.action_controller.perform_caching = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{2.days.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Store uploaded files on the local file system (see config/storage.yml for options) + config.active_storage.service = :local + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Highlight code that triggered database queries in logs. + config.active_record.verbose_query_logs = true + + # Debug mode disables concatenation and preprocessing of assets. + # This option may cause significant delays in view rendering with a large + # number of complex assets. + config.assets.debug = true + + # Suppress logger output for asset requests. + config.assets.quiet = true + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true + + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + config.file_watcher = ActiveSupport::EventedFileUpdateChecker +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 0000000000..bd39d9d752 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,94 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] + # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). + # config.require_master_key = true + + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + + # Compress JavaScripts and CSS. + config.assets.js_compressor = :uglifier + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + config.assets.compile = false + + # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Store uploaded files on the local file system (see config/storage.yml for options) + config.active_storage.service = :local + + # Mount Action Cable outside main process or domain + # config.action_cable.mount_path = nil + # config.action_cable.url = 'wss://example.com/cable' + # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Use a real queuing backend for Active Job (and separate queues per environment) + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "MediaRanker_#{Rails.env}" + + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 0000000000..0a38fd3ce9 --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,46 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure public file server for tests with Cache-Control for performance. + config.public_file_server.enabled = true + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{1.hour.to_i}" + } + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Store uploaded files on the local file system in a temporary directory + config.active_storage.service = :test + + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/config/initializers/action_view.rb b/config/initializers/action_view.rb new file mode 100644 index 0000000000..142d382f87 --- /dev/null +++ b/config/initializers/action_view.rb @@ -0,0 +1 @@ +Rails.application.config.action_view.form_with_generates_remote_forms = false diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb new file mode 100644 index 0000000000..89d2efab2b --- /dev/null +++ b/config/initializers/application_controller_renderer.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# ActiveSupport::Reloader.to_prepare do +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) +# end diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb new file mode 100644 index 0000000000..4b828e80cb --- /dev/null +++ b/config/initializers/assets.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = '1.0' + +# Add additional assets to the asset load path. +# Rails.application.config.assets.paths << Emoji.images_path +# Add Yarn node_modules folder to the asset load path. +Rails.application.config.assets.paths << Rails.root.join('node_modules') + +# Precompile additional assets. +# application.js, application.css, and all non-JS/CSS in the app/assets +# folder are already added. +# Rails.application.config.assets.precompile += %w( admin.js admin.css ) diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000000..59385cdf37 --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb new file mode 100644 index 0000000000..d3bcaa5ec8 --- /dev/null +++ b/config/initializers/content_security_policy.rb @@ -0,0 +1,25 @@ +# Be sure to restart your server when you modify this file. + +# Define an application-wide content security policy +# For further information see the following documentation +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy + +# Rails.application.config.content_security_policy do |policy| +# policy.default_src :self, :https +# policy.font_src :self, :https, :data +# policy.img_src :self, :https, :data +# policy.object_src :none +# policy.script_src :self, :https +# policy.style_src :self, :https + +# # Specify URI for violation reports +# # policy.report_uri "/csp-violation-report-endpoint" +# end + +# If you are using UJS then enable automatic nonce generation +# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) } + +# Report CSP violations to a specified URI +# For further information see the following documentation: +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only +# Rails.application.config.content_security_policy_report_only = true diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb new file mode 100644 index 0000000000..5a6a32d371 --- /dev/null +++ b/config/initializers/cookies_serializer.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Specify a serializer for the signed and encrypted cookie jars. +# Valid options are :json, :marshal, and :hybrid. +Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 0000000000..4a994e1e7b --- /dev/null +++ b/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 0000000000..ac033bf9dc --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 0000000000..dc1899682b --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb new file mode 100644 index 0000000000..bbfc3961bf --- /dev/null +++ b/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 0000000000..decc5a8573 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,33 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# The following keys must be escaped otherwise they will not be retrieved by +# the default I18n backend: +# +# true, false, on, off, yes, no +# +# Instead, surround them with single quotes. +# +# en: +# 'true': 'foo' +# +# To learn more, please read the Rails Internationalization guide +# available at http://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 0000000000..a5eccf816b --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,34 @@ +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers: a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum; this matches the default thread size of Active Record. +# +threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +threads threads_count, threads_count + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +# +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +# +environment ENV.fetch("RAILS_ENV") { "development" } + +# Specifies the number of `workers` to boot in clustered mode. +# Workers are forked webserver processes. If using threads and workers together +# the concurrency of the application would be max `threads` * `workers`. +# Workers do not work on JRuby or Windows (both of which do not support +# processes). +# +# workers ENV.fetch("WEB_CONCURRENCY") { 2 } + +# Use the `preload_app!` method when specifying a `workers` number. +# This directive tells Puma to first boot the application and load code +# before forking the application. This takes advantage of Copy On Write +# process behavior so workers use less memory. +# +# preload_app! + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000000..787824f888 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,3 @@ +Rails.application.routes.draw do + # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html +end diff --git a/config/spring.rb b/config/spring.rb new file mode 100644 index 0000000000..9fa7863f99 --- /dev/null +++ b/config/spring.rb @@ -0,0 +1,6 @@ +%w[ + .ruby-version + .rbenv-vars + tmp/restart.txt + tmp/caching-dev.txt +].each { |path| Spring.watch(path) } diff --git a/config/storage.yml b/config/storage.yml new file mode 100644 index 0000000000..d32f76e8fb --- /dev/null +++ b/config/storage.yml @@ -0,0 +1,34 @@ +test: + service: Disk + root: <%= Rails.root.join("tmp/storage") %> + +local: + service: Disk + root: <%= Rails.root.join("storage") %> + +# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) +# amazon: +# service: S3 +# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> +# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> +# region: us-east-1 +# bucket: your_own_bucket + +# Remember not to checkin your GCS keyfile to a repository +# google: +# service: GCS +# project: your_project +# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> +# bucket: your_own_bucket + +# Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) +# microsoft: +# service: AzureStorage +# storage_account_name: your_account_name +# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> +# container: your_container_name + +# mirror: +# service: Mirror +# primary: local +# mirrors: [ amazon, google, microsoft ] diff --git a/db/seeds.rb b/db/seeds.rb new file mode 100644 index 0000000000..1beea2accd --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,7 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). +# +# Examples: +# +# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) +# Character.create(name: 'Luke', movie: movies.first) diff --git a/lib/assets/.keep b/lib/assets/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/log/.keep b/log/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package.json b/package.json new file mode 100644 index 0000000000..625900f9d8 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "name": "MediaRanker", + "private": true, + "dependencies": {} +} diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000000..2be3af26fc --- /dev/null +++ b/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/422.html b/public/422.html new file mode 100644 index 0000000000..c08eac0d1d --- /dev/null +++ b/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/500.html b/public/500.html new file mode 100644 index 0000000000..78a030af22 --- /dev/null +++ b/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000000..37b576a4a0 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/storage/.keep b/storage/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb new file mode 100644 index 0000000000..d19212abd5 --- /dev/null +++ b/test/application_system_test_case.rb @@ -0,0 +1,5 @@ +require "test_helper" + +class ApplicationSystemTestCase < ActionDispatch::SystemTestCase + driven_by :selenium, using: :chrome, screen_size: [1400, 1400] +end diff --git a/test/controllers/.keep b/test/controllers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/.keep b/test/fixtures/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/files/.keep b/test/fixtures/files/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/helpers/.keep b/test/helpers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/integration/.keep b/test/integration/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/mailers/.keep b/test/mailers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/models/.keep b/test/models/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/system/.keep b/test/system/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000000..2b5172a7d6 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,24 @@ +ENV["RAILS_ENV"] = "test" +require File.expand_path("../../config/environment", __FILE__) +require "rails/test_help" +require "minitest/rails"require "minitest/reporters" # for Colorized output +# For colorful output! +Minitest::Reporters.use!( + Minitest::Reporters::SpecReporter.new, + ENV, + Minitest.backtrace_filter +) + + +# To add Capybara feature tests add `gem "minitest-rails-capybara"` +# to the test group in the Gemfile and uncomment the following: +# require "minitest/rails/capybara" + +# Uncomment for awesome colorful output +# require "minitest/pride" + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + # Add more helper methods to be used by all tests here... +end diff --git a/tmp/.keep b/tmp/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 0000000000..e69de29bb2 From acd97c54ea5dd5a1100d536f0183158493140786 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 07:43:04 -0700 Subject: [PATCH 02/59] nav bar and index, show methods --- app/assets/javascripts/works.js | 2 + app/assets/stylesheets/application.scss | 65 +++++++++++++++++++++++ app/assets/stylesheets/works.scss | 3 ++ app/controllers/works_controller.rb | 5 ++ app/helpers/works_helper.rb | 2 + app/models/work.rb | 2 + app/views/layouts/application.html.erb | 17 +++++- app/views/works/index.html.erb | 29 ++++++++++ config/routes.rb | 1 + db/migrate/20190422220845_create_works.rb | 13 +++++ db/schema.rb | 28 ++++++++++ db/seeds.rb | 21 ++++++++ test/controllers/works_controller_test.rb | 11 ++++ test/fixtures/works.yml | 15 ++++++ test/models/work_test.rb | 9 ++++ test/test_helper.rb | 4 +- 16 files changed, 224 insertions(+), 3 deletions(-) create mode 100644 app/assets/javascripts/works.js create mode 100644 app/assets/stylesheets/works.scss create mode 100644 app/controllers/works_controller.rb create mode 100644 app/helpers/works_helper.rb create mode 100644 app/models/work.rb create mode 100644 app/views/works/index.html.erb create mode 100644 db/migrate/20190422220845_create_works.rb create mode 100644 db/schema.rb create mode 100644 test/controllers/works_controller_test.rb create mode 100644 test/fixtures/works.yml create mode 100644 test/models/work_test.rb diff --git a/app/assets/javascripts/works.js b/app/assets/javascripts/works.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/works.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index b4d20f5641..bcca92c509 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -15,3 +15,68 @@ @import "bootstrap"; /* Import scss content */ @import "**/*"; + +// .content { +// grid-template-rows: 150px 1; +// } + +.overall-header { + max-width: 100%; + background-color: #B2DFDB; + margin-bottom: 0.5rem; + padding: 2rem 1rem 0.5rem 1rem; + display: block; + // box-sizing: border-box; +} + +.overall-header h1 { + display: block; + font-weight: bold; + // line-height: 1.2; + // color: inherit; + margin-block-start: 0.67em; + margin-block-end: 0.67em; + margin-inline-start: 0px; + margin-inline-end: 0px; +} + +.overall-header h1 a { + color: #FF5722; + border-right: white 2px solid; + padding-right: 25px; + margin-right: 15px; +} + +.overall-header h1 .small { + color: white; + border-right: none; +} +nav { + display: flex; +} + +.overall-header .nav-link { + color: #00796b; + display: inline-block; + // padding: 0.5rem 1rem; +} + + +ul { + display: flex; + flex-wrap: wrap; + flex-direction: row; + list-style-type: none; + // margin-block-start: 0.67em; + margin-block-end: 0.67em; + // margin-inline-start: 0px; + // margin-inline-end: 0px; +} + +.button .btn { + // display: flex; + // justify-content: flex-end; + background-color: #26A69A; + color: white; + +} diff --git a/app/assets/stylesheets/works.scss b/app/assets/stylesheets/works.scss new file mode 100644 index 0000000000..5618452f3e --- /dev/null +++ b/app/assets/stylesheets/works.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Works controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb new file mode 100644 index 0000000000..4aa80a741a --- /dev/null +++ b/app/controllers/works_controller.rb @@ -0,0 +1,5 @@ +class WorksController < ApplicationController + def index + @works = Work.all + end +end diff --git a/app/helpers/works_helper.rb b/app/helpers/works_helper.rb new file mode 100644 index 0000000000..ccb78c2b73 --- /dev/null +++ b/app/helpers/works_helper.rb @@ -0,0 +1,2 @@ +module WorksHelper +end diff --git a/app/models/work.rb b/app/models/work.rb new file mode 100644 index 0000000000..95322dd45e --- /dev/null +++ b/app/models/work.rb @@ -0,0 +1,2 @@ +class Work < ApplicationRecord +end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index f32268a271..c1e1fc7c22 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -8,7 +8,22 @@ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> - +
+

+ Media Ranker + Ranking the Best of Everything +

+ +
<%= yield %> diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb new file mode 100644 index 0000000000..ebf45249dc --- /dev/null +++ b/app/views/works/index.html.erb @@ -0,0 +1,29 @@ +

List of Works

+
+
    +

    Albums

    +<% @works.each do |work|%> + <% if work.category == "album"%> +
  • <%=link_to "#{work.title}", work_path(work.id), method: :get %>
  • + <%end%> +<% end %> +
+
    +

    Books

    +<% @works.each do |work|%> + <% if work.category == "book"%> +
  • <%=link_to "#{work.title}", work_path(work.id), method: :get %>
  • + <%end%> +<% end %> +
+ +
    +

    Movies

    +<% @works.each do |work|%> + <% if work.category == "movie"%> +
  • <%=link_to "#{work.title}", work_path(work.id), method: :get %>
  • + <%end%> +<% end %> + +
+
\ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 787824f888..7da8731aa7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,4 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + resources :works, only: [:index, :show] end diff --git a/db/migrate/20190422220845_create_works.rb b/db/migrate/20190422220845_create_works.rb new file mode 100644 index 0000000000..d6e24fdb58 --- /dev/null +++ b/db/migrate/20190422220845_create_works.rb @@ -0,0 +1,13 @@ +class CreateWorks < ActiveRecord::Migration[5.2] + def change + create_table :works do |t| + t.string :category + t.string :title + t.string :creator + t.integer :publication_year + t.string :description + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..1d23618bc7 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,28 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 2019_04_22_220845) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "works", force: :cascade do |t| + t.string "category" + t.string "title" + t.string "creator" + t.integer "publication_year" + t.string "description" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + +end diff --git a/db/seeds.rb b/db/seeds.rb index 1beea2accd..a8cd218227 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,3 +1,4 @@ +require "csv" # This file should contain all the record creation needed to seed the database with its default values. # The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). # @@ -5,3 +6,23 @@ # # movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) # Character.create(name: 'Luke', movie: movies.first) +MEDIA_FILE = Rails.root.join("db", "media_seeds.csv") +puts "Loading raw driver data from #{MEDIA_FILE}" +media_failures = [] +CSV.foreach(MEDIA_FILE, :headers => true) do |row| + media = Work.new + media.category = row["category"] + media.title = row["title"] + media.creator = row["creator"] + media.publication_year = row["publication_year"] + media.description = row["description"] + successful = media.save + if !successful + media_failures << media + puts "Failed to save work: #{media.inspect}" + else + puts "Created work: #{media.inspect}" + end +end +puts "Added #{media.count} work records" +puts "#{media_failures.length} work failed" diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb new file mode 100644 index 0000000000..0f1b3e19c3 --- /dev/null +++ b/test/controllers/works_controller_test.rb @@ -0,0 +1,11 @@ +require "test_helper" + +describe WorksController do + describe "index" do + it "can get the index" do + get works_path + + must_respond_with :success + end + end +end diff --git a/test/fixtures/works.yml b/test/fixtures/works.yml new file mode 100644 index 0000000000..6772d84de5 --- /dev/null +++ b/test/fixtures/works.yml @@ -0,0 +1,15 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + category: MyString + title: MyString + creator: MyString + publication_year: 1 + description: MyString + +two: + category: MyString + title: MyString + creator: MyString + publication_year: 1 + description: MyString diff --git a/test/models/work_test.rb b/test/models/work_test.rb new file mode 100644 index 0000000000..f6fba7104d --- /dev/null +++ b/test/models/work_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Work do + let(:work) { Work.new } + + it "must be valid" do + value(work).must_be :valid? + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index 2b5172a7d6..3f7dc7d3ed 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,7 +1,8 @@ ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) require "rails/test_help" -require "minitest/rails"require "minitest/reporters" # for Colorized output +require "minitest/rails" +require "minitest/reporters" # for Colorized output # For colorful output! Minitest::Reporters.use!( Minitest::Reporters::SpecReporter.new, @@ -9,7 +10,6 @@ Minitest.backtrace_filter ) - # To add Capybara feature tests add `gem "minitest-rails-capybara"` # to the test group in the Gemfile and uncomment the following: # require "minitest/rails/capybara" From f902c9399694f346d9d6ada213d199d739e8a716 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 08:05:29 -0700 Subject: [PATCH 03/59] added show and testsand basic html to show media details --- app/controllers/works_controller.rb | 34 +++++++++++++++++++++++ app/views/works/show.html.erb | 5 ++++ test/controllers/works_controller_test.rb | 17 ++++++++++++ test/fixtures/works.yml | 7 +++++ 4 files changed, 63 insertions(+) create mode 100644 app/views/works/show.html.erb diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 4aa80a741a..e4fc728284 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -2,4 +2,38 @@ class WorksController < ApplicationController def index @works = Work.all end + + def show + @work = Work.find_by(id: params[:id]) + + unless @work + redirect_to works_path + return + end + + # @unrated_trip = @passenger.trips.find_by(rating: nil) + # @trip = Trip.new + # @trips = @passenger.trips + end + +# def new +# @work = Work.new +# end +# +# def create +# @passenger = Passenger.new passenger_params +# successful = @passenger.save +# if successful +# redirect_to passengers_path +# else +# render :new +# end +# end + +# def edit +# @passenger = Passenger.find_by(id: params[:id]) +# unless @passenger +# redirect_to passengers_path +# end +# end end diff --git a/app/views/works/show.html.erb b/app/views/works/show.html.erb new file mode 100644 index 0000000000..50b91a445d --- /dev/null +++ b/app/views/works/show.html.erb @@ -0,0 +1,5 @@ +

<%=@work.title%>

+

Created by: <%=@work.creator%> +

Published: <%= @work.publication_year %>

+

<%=@work.description%> +<%= link_to 'Back to media ranks', works_path, class: "back-button"%> diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb index 0f1b3e19c3..3d5b080c8e 100644 --- a/test/controllers/works_controller_test.rb +++ b/test/controllers/works_controller_test.rb @@ -8,4 +8,21 @@ must_respond_with :success end end + + describe "show" do + it "can get the details page" do + work = works(:custom1) + get work_path(work.id) + + must_respond_with :success + end + + it "will redirect if given an invalid work ID" do + get work_path(-1) + + must_respond_with :redirect + end + end end + +#validate things? use fixtures or let? diff --git a/test/fixtures/works.yml b/test/fixtures/works.yml index 6772d84de5..ae1ac82e0a 100644 --- a/test/fixtures/works.yml +++ b/test/fixtures/works.yml @@ -13,3 +13,10 @@ two: creator: MyString publication_year: 1 description: MyString + +custom1: + category: book + title: "Pride and Prejudice" + creator: "Jane Austen" + publication_year: 1813 + description: "Emotional development of protagonist, Elizabeth Bennett" From a8f6a636aa16d6866cf733600bbe50f415b23329 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 08:39:32 -0700 Subject: [PATCH 04/59] edit method and erb form --- app/controllers/works_controller.rb | 51 ++++++++++++++++++----------- app/views/works/_form.html.erb | 34 +++++++++++++++++++ app/views/works/edit.html.erb | 6 ++++ config/routes.rb | 2 +- 4 files changed, 72 insertions(+), 21 deletions(-) create mode 100644 app/views/works/_form.html.erb create mode 100644 app/views/works/edit.html.erb diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index e4fc728284..9490606fc9 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -2,7 +2,7 @@ class WorksController < ApplicationController def index @works = Work.all end - + def show @work = Work.find_by(id: params[:id]) @@ -16,24 +16,35 @@ def show # @trips = @passenger.trips end -# def new -# @work = Work.new -# end -# -# def create -# @passenger = Passenger.new passenger_params -# successful = @passenger.save -# if successful -# redirect_to passengers_path -# else -# render :new -# end -# end + # def new + # @work = Work.new + # end + # + # def create + # @passenger = Passenger.new passenger_params + # successful = @passenger.save + # if successful + # redirect_to passengers_path + # else + # render :new + # end + # end -# def edit -# @passenger = Passenger.find_by(id: params[:id]) -# unless @passenger -# redirect_to passengers_path -# end -# end + def edit + @work = Work.find_by(id: params[:id]) + unless @work + redirect_to works_path, flash: { error: "Could not find media with id: #{@work.id}" } + end + end + + def destroy + work_id = params[:id] + work = Work.find_by(id: work_id) + unless work + head :not_found + return + end + work.destroy + redirect_to works_path + end end diff --git a/app/views/works/_form.html.erb b/app/views/works/_form.html.erb new file mode 100644 index 0000000000..8f32667757 --- /dev/null +++ b/app/views/works/_form.html.erb @@ -0,0 +1,34 @@ +

+<% if @work.errors.messages.any? %> +
+ There are errors with your submission +
    + <% @work.errors.messages.each do |col, prob| %> + <% prob.each do |problem|%> +
  • <%= col%>: <%= problem%>
  • + <% end %> + <% end %> +
+
+ <% end %> + +<%= form_with model: @work, class: "task-form" do |f| %> +
+ <%=f.label :category, "Category" %> + <%= f.select :category, ["album", "movie", "book"]%> +
+
+ <%=f.label :title, "Title:" %> + <%= f.text_field :title %> +
+
+ <%=f.label :publication_year, "Publication year" %> + <%= f.text_field :publication_year %> +
+ +
+ <%=f.label :description, "Description" %> + <%= f.text_area :description %> +
+<% end %> +
diff --git a/app/views/works/edit.html.erb b/app/views/works/edit.html.erb new file mode 100644 index 0000000000..53815fe1a3 --- /dev/null +++ b/app/views/works/edit.html.erb @@ -0,0 +1,6 @@ +

Edit This <%=@work.category.capitalize%>

+<%= render 'form' %> +
+<%= form_with model: @work, class: "task-form" do |f| %> +<%= f.submit "Update Work", class: "task-button"%> +<%end%> \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 7da8731aa7..2365fd21d3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,4 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - resources :works, only: [:index, :show] + resources :works, only: [:index, :show, :edit, :delete] end From 72c0532d62c43a3a57cc321409c7376c213a29dc Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 08:46:51 -0700 Subject: [PATCH 05/59] work controller edit method tests --- app/controllers/works_controller.rb | 4 ++-- test/controllers/works_controller_test.rb | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 9490606fc9..f26bcad195 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -7,7 +7,7 @@ def show @work = Work.find_by(id: params[:id]) unless @work - redirect_to works_path + redirect_to works_path, flash: { error: "Could not find media with that id: #{params[:id]}" } return end @@ -33,7 +33,7 @@ def show def edit @work = Work.find_by(id: params[:id]) unless @work - redirect_to works_path, flash: { error: "Could not find media with id: #{@work.id}" } + redirect_to works_path, flash: { error: "Could not find media with id: #{params[:id]}" } end end diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb index 3d5b080c8e..352c33e0d1 100644 --- a/test/controllers/works_controller_test.rb +++ b/test/controllers/works_controller_test.rb @@ -23,6 +23,19 @@ must_respond_with :redirect end end + + describe "edit" do + it "can get the edit page for an existing work" do + work = Work.first + get edit_work_path(work.id) + must_respond_with :success + end + + it "will respond with a redirect when attempting to edit a nonexistent work" do + get edit_work_path(-1) + must_redirect_to works_path + end + end end #validate things? use fixtures or let? From 4c15efa407f00450ef18e5883d68e5685b5852e5 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 08:49:57 -0700 Subject: [PATCH 06/59] destroy tests work controller added --- config/routes.rb | 2 +- test/controllers/works_controller_test.rb | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 2365fd21d3..717eb2cd24 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,4 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - resources :works, only: [:index, :show, :edit, :delete] + resources :works, only: [:index, :show, :edit, :destroy] end diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb index 352c33e0d1..a82d2f5926 100644 --- a/test/controllers/works_controller_test.rb +++ b/test/controllers/works_controller_test.rb @@ -36,6 +36,18 @@ must_redirect_to works_path end end + + it "removes the work from the database" do + work_to_delete = Work.first + expect { + delete work_path(work_to_delete) + }.must_change "Work.count", -1 + must_respond_with :redirect + must_redirect_to works_path + + after_delete_work = Work.find_by(id: work_to_delete.id) + expect(after_delete_work).must_be_nil + end end #validate things? use fixtures or let? From b3aa6dabeb638d89d0845ce7739abab692dfcd20 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 09:27:03 -0700 Subject: [PATCH 07/59] destroy method and tests for work_controller --- app/views/works/show.html.erb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/views/works/show.html.erb b/app/views/works/show.html.erb index 50b91a445d..0012a6d155 100644 --- a/app/views/works/show.html.erb +++ b/app/views/works/show.html.erb @@ -3,3 +3,5 @@

Published: <%= @work.publication_year %>

<%=@work.description%> <%= link_to 'Back to media ranks', works_path, class: "back-button"%> +<%= link_to "Edit", edit_work_path(@work.id), class: "link-list-edit" %> +<%= link_to "Delete", work_path(@work.id), class: "link-list-delete", method: :delete, confirm: "Are you sure?" %> \ No newline at end of file From cce630c47841b41e15dedc70130168f0486ea203 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 09:47:30 -0700 Subject: [PATCH 08/59] flash status --- app/controllers/works_controller.rb | 6 +++++- app/views/layouts/application.html.erb | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index f26bcad195..f0060c610a 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -7,7 +7,9 @@ def show @work = Work.find_by(id: params[:id]) unless @work - redirect_to works_path, flash: { error: "Could not find media with that id: #{params[:id]}" } + flash[:status] = :error + flash[:message] = "Could not find media with that id: #{params[:id]}" + redirect_to works_path return end @@ -47,4 +49,6 @@ def destroy work.destroy redirect_to works_path end + + end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index c1e1fc7c22..cb3add8dd8 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -25,6 +25,9 @@ +

+ <%=flash[:message]%> +
<%= yield %> From 244cc2c75fd10b19f102b64fbf6b1df0e9a2c570 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 10:20:03 -0700 Subject: [PATCH 09/59] revised tests for flash so it is a helper method in test_helper.rb --- app/controllers/works_controller.rb | 4 ++-- test/controllers/works_controller_test.rb | 4 ++++ test/test_helper.rb | 4 ++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index f0060c610a..b8c1f12674 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -47,8 +47,8 @@ def destroy return end work.destroy + flash[:status] = :success + flash[:message] = "Successfully deleted work #{work.id}" redirect_to works_path end - - end diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb index a82d2f5926..8f83baf007 100644 --- a/test/controllers/works_controller_test.rb +++ b/test/controllers/works_controller_test.rb @@ -1,6 +1,7 @@ require "test_helper" describe WorksController do + describe "index" do it "can get the index" do get works_path @@ -45,6 +46,9 @@ must_respond_with :redirect must_redirect_to works_path + check_flash + # check_flash(:error) + after_delete_work = Work.find_by(id: work_to_delete.id) expect(after_delete_work).must_be_nil end diff --git a/test/test_helper.rb b/test/test_helper.rb index 3f7dc7d3ed..bc23e6e1a2 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -21,4 +21,8 @@ class ActiveSupport::TestCase # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. fixtures :all # Add more helper methods to be used by all tests here... + def check_flash(expected_status = :success) + expect(flash[:status]).must_equal(expected_status) + expect(flash[:message]).wont_be_nil + end end From e8e3c57fe4ab23e523e2c3f5d6a12519332da8eb Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 11:34:45 -0700 Subject: [PATCH 10/59] additional flash stuff --- app/assets/stylesheets/application.scss | 4 ---- app/views/layouts/application.html.erb | 14 ++++++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index bcca92c509..bba1932e5f 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -74,9 +74,5 @@ ul { } .button .btn { - // display: flex; - // justify-content: flex-end; background-color: #26A69A; - color: white; - } diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index cb3add8dd8..a9240b4c8b 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -13,18 +13,20 @@ Media Ranker Ranking the Best of Everything - +
<%# <% alert_type = flash[:status] == :error ? :danger, flash[:status]%> @@ -32,4 +33,5 @@ <%= yield %> +
diff --git a/app/views/works/show.html.erb b/app/views/works/show.html.erb index 0012a6d155..a52286accf 100644 --- a/app/views/works/show.html.erb +++ b/app/views/works/show.html.erb @@ -2,6 +2,6 @@

Created by: <%=@work.creator%>

Published: <%= @work.publication_year %>

<%=@work.description%> -<%= link_to 'Back to media ranks', works_path, class: "back-button"%> -<%= link_to "Edit", edit_work_path(@work.id), class: "link-list-edit" %> -<%= link_to "Delete", work_path(@work.id), class: "link-list-delete", method: :delete, confirm: "Are you sure?" %> \ No newline at end of file +<%= link_to 'Back to media ranks', works_path, class: "btn btn-primary"%> +<%= link_to "Edit", edit_work_path(@work.id), class: "btn btn-primary" %> +<%= link_to "Delete", work_path(@work.id), class:"btn btn-primary", method: :delete, confirm: "Are you sure?" %> \ No newline at end of file From 3d0cc35f0812bdfeb911cc6c48badc3809272e11 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 14:26:27 -0700 Subject: [PATCH 13/59] generated user controller and model, added routes for logging in and out --- app/assets/javascripts/users.js | 2 ++ app/assets/stylesheets/users.scss | 3 +++ app/controllers/users_controller.rb | 2 ++ app/helpers/users_helper.rb | 2 ++ app/models/user.rb | 2 ++ app/views/works/index.html.erb | 2 +- config/routes.rb | 5 +++++ db/migrate/20190423212500_create_users.rb | 9 +++++++++ db/schema.rb | 8 +++++++- test/controllers/users_controller_test.rb | 7 +++++++ test/fixtures/users.yml | 7 +++++++ test/models/user_test.rb | 9 +++++++++ 12 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 app/assets/javascripts/users.js create mode 100644 app/assets/stylesheets/users.scss create mode 100644 app/controllers/users_controller.rb create mode 100644 app/helpers/users_helper.rb create mode 100644 app/models/user.rb create mode 100644 db/migrate/20190423212500_create_users.rb create mode 100644 test/controllers/users_controller_test.rb create mode 100644 test/fixtures/users.yml create mode 100644 test/models/user_test.rb diff --git a/app/assets/javascripts/users.js b/app/assets/javascripts/users.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/users.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss new file mode 100644 index 0000000000..31a2eacb84 --- /dev/null +++ b/app/assets/stylesheets/users.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Users controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb new file mode 100644 index 0000000000..3e74dea87f --- /dev/null +++ b/app/controllers/users_controller.rb @@ -0,0 +1,2 @@ +class UsersController < ApplicationController +end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb new file mode 100644 index 0000000000..2310a240d7 --- /dev/null +++ b/app/helpers/users_helper.rb @@ -0,0 +1,2 @@ +module UsersHelper +end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 0000000000..379658a509 --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,2 @@ +class User < ApplicationRecord +end diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb index a2796f4107..ca1ea20ea4 100644 --- a/app/views/works/index.html.erb +++ b/app/views/works/index.html.erb @@ -17,7 +17,7 @@ <% if work.category == category%> - <%=link_to "#{work.title}", work_path(work.id), method: :get %> + <%=link_to "#{work.title}", work_path(work.id), method: :ge t %> <%=work.creator%> <%=work.publication_year%> <%end%> diff --git a/config/routes.rb b/config/routes.rb index 717eb2cd24..399ef2e40b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,9 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html resources :works, only: [:index, :show, :edit, :destroy] + + get "/login", to: "users#login_form", as: "login" + post "/login", to: "users#login" + post "/logout", to: "users#logout", as: "logout" + get "/users/current", to: "users#current", as: "current_user" end diff --git a/db/migrate/20190423212500_create_users.rb b/db/migrate/20190423212500_create_users.rb new file mode 100644 index 0000000000..9c711e759b --- /dev/null +++ b/db/migrate/20190423212500_create_users.rb @@ -0,0 +1,9 @@ +class CreateUsers < ActiveRecord::Migration[5.2] + def change + create_table :users do |t| + t.string :username + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 1d23618bc7..7fa207d71d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,11 +10,17 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_04_22_220845) do +ActiveRecord::Schema.define(version: 2019_04_23_212500) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "users", force: :cascade do |t| + t.string "username" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "works", force: :cascade do |t| t.string "category" t.string "title" diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb new file mode 100644 index 0000000000..89decb54e0 --- /dev/null +++ b/test/controllers/users_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe UsersController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml new file mode 100644 index 0000000000..952febd97d --- /dev/null +++ b/test/fixtures/users.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + username: MyString + +two: + username: MyString diff --git a/test/models/user_test.rb b/test/models/user_test.rb new file mode 100644 index 0000000000..cc862ac2d9 --- /dev/null +++ b/test/models/user_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe User do + let(:user) { User.new } + + it "must be valid" do + value(user).must_be :valid? + end +end From aa72fdba1e2f55eef3b479af9216f0957053a06e Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 14:57:28 -0700 Subject: [PATCH 14/59] login and logout methods in users controller --- app/controllers/users_controller.rb | 30 ++++++++++++++++++++++++++ app/views/layouts/application.html.erb | 6 +++++- app/views/users/current.html.erb | 1 + app/views/users/login_form.html.erb | 6 ++++++ app/views/works/index.html.erb | 2 +- 5 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 app/views/users/current.html.erb create mode 100644 app/views/users/login_form.html.erb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 3e74dea87f..39c49d9267 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,2 +1,32 @@ class UsersController < ApplicationController + def login_form + @user = User.new + end + + def login + username = params[:user][:username] + @user = User.find_by(username: username) + if @user + flash[:success] = "Succesfully logged in as new user #{username}" + else + @user = User.create(username: username) + flash[:success] = "Succesfully logged in as returning user #{username}" + end + session[:user_id] = @user.id + + redirect_to works_path + end + + def current + @user = User.find(session[:user_id]) + unless @user + flash[:error] = "You must be logged in to see this page." + end + # redirect_to root_path + end + + def logout + session[:user_id] = nil + redirect_to works_path + end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 288706b428..76ab69c892 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -21,7 +21,11 @@

    -
  • Log In
  • + <% if !session[:user_id]%> +
  • <%=link_to "Log In", login_path, class: "btn btn-primary"%>
  • + <% else %> +
  • <%=link_to "Log Out", logout_path, method: :post, class: "btn btn-primary"%>
  • + <%end%>
    diff --git a/app/views/users/current.html.erb b/app/views/users/current.html.erb new file mode 100644 index 0000000000..3e7bf37077 --- /dev/null +++ b/app/views/users/current.html.erb @@ -0,0 +1 @@ +

    You are logged in as user <%= @user.username %>

    diff --git a/app/views/users/login_form.html.erb b/app/views/users/login_form.html.erb new file mode 100644 index 0000000000..448f30413d --- /dev/null +++ b/app/views/users/login_form.html.erb @@ -0,0 +1,6 @@ +<%= form_with model: @user, url: login_path do |f| %> + <%= f.label :username %> + <%= f.text_field :username %> + + <%= f.submit "Log In" %> +<% end %> \ No newline at end of file diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb index ca1ea20ea4..a2796f4107 100644 --- a/app/views/works/index.html.erb +++ b/app/views/works/index.html.erb @@ -17,7 +17,7 @@ <% if work.category == category%> - <%=link_to "#{work.title}", work_path(work.id), method: :ge t %> + <%=link_to "#{work.title}", work_path(work.id), method: :get %> <%=work.creator%> <%=work.publication_year%> <%end%> From 1af4010b27860208eab234e50d1b13f0583ba5d2 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 15:06:15 -0700 Subject: [PATCH 15/59] flash statuses for logging in and out --- app/controllers/users_controller.rb | 9 ++++++--- app/views/layouts/application.html.erb | 7 ++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 39c49d9267..363900c4fb 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -7,10 +7,12 @@ def login username = params[:user][:username] @user = User.find_by(username: username) if @user - flash[:success] = "Succesfully logged in as new user #{username}" + flash[:status] = :success + flash[:message] = "Succesfully logged in as returning user #{username}" else @user = User.create(username: username) - flash[:success] = "Succesfully logged in as returning user #{username}" + flash[:status] = :success + flash[:message] = "Succesfully logged in as new user #{username}" end session[:user_id] = @user.id @@ -20,7 +22,8 @@ def login def current @user = User.find(session[:user_id]) unless @user - flash[:error] = "You must be logged in to see this page." + flash[:status] = :error + flash[:message] = "You must be logged in to see this page." end # redirect_to root_path end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 76ab69c892..455d651ed5 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -22,6 +22,7 @@
    <% if !session[:user_id]%> +
  • <%=link_to "Log In", login_path, class: "btn btn-primary"%>
  • <% else %>
  • <%=link_to "Log Out", logout_path, method: :post, class: "btn btn-primary"%>
  • @@ -31,9 +32,9 @@
    - <%# <% alert_type = flash[:status] == :error ? :danger, flash[:status]%> -
    - <%=flash[:message]%> + <% alert_type = flash[:status] == :error ? :danger : flash[:status] %> +
    + <%= flash[:message] %>
    <%= yield %> From 92bc4ba4b3b2322bbf96fe6b2dd803b42fd5daa8 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 15:31:24 -0700 Subject: [PATCH 16/59] started testing for login and logout methods in user controller --- test/controllers/users_controller_test.rb | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index 89decb54e0..61354e2d19 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -1,7 +1,18 @@ require "test_helper" describe UsersController do - # it "must be a real test" do - # flunk "Need real tests" + it "gets the login path" do + get login_path + + must_respond_with :success + end + + # it "successfully logs a user in" do + # username = "cyndi" + # user = User.create(username: username) + + # expect { + # post login_path(user) + # }.must_change "User.count", +1 # end end From 8c2cd6242dc0b9b365972e83da17739993fe8334 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 16:43:43 -0700 Subject: [PATCH 17/59] updated erb forms and edit and new and create and update methods --- app/assets/stylesheets/application.scss | 8 ++++ app/controllers/works_controller.rb | 51 ++++++++++++++++++------- app/views/layouts/application.html.erb | 3 +- app/views/works/_form.html.erb | 26 ++++++++----- app/views/works/edit.html.erb | 6 +-- app/views/works/new.html.erb | 2 + config/routes.rb | 2 +- 7 files changed, 66 insertions(+), 32 deletions(-) create mode 100644 app/views/works/new.html.erb diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 2a7f245413..cef84d38c6 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -95,3 +95,11 @@ main { padding: 2rem; display: block; } + +.form-control { + display: block; + width: 100%; + height: calc(2.25rem+2px); + padding: 0.375rem 0.75rem; + line-height: 1.5; +} \ No newline at end of file diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index b8c1f12674..238ae0ac47 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -3,6 +3,20 @@ def index @works = Work.all end + def new + @work = Work.new + end + + def create + @work = Work.new(work_params) + successful = @work.save + if successful + redirect_to works_path + else + render :new + end + end + def show @work = Work.find_by(id: params[:id]) @@ -18,20 +32,6 @@ def show # @trips = @passenger.trips end - # def new - # @work = Work.new - # end - # - # def create - # @passenger = Passenger.new passenger_params - # successful = @passenger.save - # if successful - # redirect_to passengers_path - # else - # render :new - # end - # end - def edit @work = Work.find_by(id: params[:id]) unless @work @@ -39,6 +39,23 @@ def edit end end + def update + @work = Work.find_by(id: params[:id]) + unless @work + head :not_found + return + end + if @work.update(work_params) + flash[:status] = :success + flash[:message] = "Successfully updated media #{@work.id}" + redirect_to work_path(@work) + else + flash.now[:status] = :error + flash.now[:message] = "Could not save work #{@work.id}" + render :edit, status: :bad_request + end + end + def destroy work_id = params[:id] work = Work.find_by(id: work_id) @@ -51,4 +68,10 @@ def destroy flash[:message] = "Successfully deleted work #{work.id}" redirect_to works_path end + + private + + def work_params + return params.require(:work).permit(:category, :title, :creator, :publication_year, :description) + end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 455d651ed5..6278037bb1 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -17,7 +17,7 @@
      @@ -31,7 +31,6 @@
      - <% alert_type = flash[:status] == :error ? :danger : flash[:status] %>
      <%= flash[:message] %> diff --git a/app/views/works/_form.html.erb b/app/views/works/_form.html.erb index 8f32667757..91b14f3643 100644 --- a/app/views/works/_form.html.erb +++ b/app/views/works/_form.html.erb @@ -12,23 +12,29 @@
      <% end %> -<%= form_with model: @work, class: "task-form" do |f| %> -
      - <%=f.label :category, "Category" %> - <%= f.select :category, ["album", "movie", "book"]%> +<%= form_with model: @work do |f| %> +
      + <%=f.label :category, "Category"%> + <%= f.select :category, ["album", "movie", "book"], class: "form-control"%>
      -
      +
      <%=f.label :title, "Title:" %> - <%= f.text_field :title %> + <%= f.text_field :title, class: "form-control"%>
      -
      +
      + <%=f.label :creator, "Creator:" %> + <%= f.text_field :creator, class: "form-control" %> +
      +
      <%=f.label :publication_year, "Publication year" %> - <%= f.text_field :publication_year %> + <%= f.text_field :publication_year, class: "form-control"%>
      -
      +
      <%=f.label :description, "Description" %> - <%= f.text_area :description %> + <%= f.text_area :description, class: "form-control"%>
      + +<%= f.submit button_text, class: "btn btn-primary"%> <% end %>
      diff --git a/app/views/works/edit.html.erb b/app/views/works/edit.html.erb index 53815fe1a3..d084aba45d 100644 --- a/app/views/works/edit.html.erb +++ b/app/views/works/edit.html.erb @@ -1,6 +1,2 @@

      Edit This <%=@work.category.capitalize%>

      -<%= render 'form' %> -
      -<%= form_with model: @work, class: "task-form" do |f| %> -<%= f.submit "Update Work", class: "task-button"%> -<%end%> \ No newline at end of file +<%= render partial: 'form', locals: {button_text: "Update Work"} %> diff --git a/app/views/works/new.html.erb b/app/views/works/new.html.erb new file mode 100644 index 0000000000..8f8c360e8c --- /dev/null +++ b/app/views/works/new.html.erb @@ -0,0 +1,2 @@ +

      Add a new work

      +<%= render partial: 'form', locals: {button_text: "Create Work"} %> diff --git a/config/routes.rb b/config/routes.rb index 399ef2e40b..e75fd0887f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,6 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - resources :works, only: [:index, :show, :edit, :destroy] + resources :works, only: [:index, :new, :create, :show, :edit, :update, :destroy] get "/login", to: "users#login_form", as: "login" post "/login", to: "users#login" From 8447de640c8d21b90cfb5ffe5a0e6d1f2ccb7ecc Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 19:11:30 -0700 Subject: [PATCH 18/59] added route, index, erb for homepage --- app/assets/javascripts/homepages.js | 2 ++ app/assets/stylesheets/application.scss | 7 ----- app/assets/stylesheets/homepages.scss | 30 ++++++++++++++++++ app/controllers/homepages_controller.rb | 4 +++ app/helpers/homepages_helper.rb | 2 ++ app/models/homepage.rb | 5 +++ app/views/homepages/index.html.erb | 31 +++++++++++++++++++ config/routes.rb | 2 +- db/migrate/20190423235044_create_homepages.rb | 8 +++++ db/schema.rb | 7 ++++- test/controllers/homepages_controller_test.rb | 5 +++ test/fixtures/homepages.yml | 11 +++++++ test/models/homepage_test.rb | 9 ++++++ 13 files changed, 114 insertions(+), 9 deletions(-) create mode 100644 app/assets/javascripts/homepages.js create mode 100644 app/assets/stylesheets/homepages.scss create mode 100644 app/controllers/homepages_controller.rb create mode 100644 app/helpers/homepages_helper.rb create mode 100644 app/models/homepage.rb create mode 100644 app/views/homepages/index.html.erb create mode 100644 db/migrate/20190423235044_create_homepages.rb create mode 100644 test/controllers/homepages_controller_test.rb create mode 100644 test/fixtures/homepages.yml create mode 100644 test/models/homepage_test.rb diff --git a/app/assets/javascripts/homepages.js b/app/assets/javascripts/homepages.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/homepages.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index cef84d38c6..86c8d17795 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -96,10 +96,3 @@ main { display: block; } -.form-control { - display: block; - width: 100%; - height: calc(2.25rem+2px); - padding: 0.375rem 0.75rem; - line-height: 1.5; -} \ No newline at end of file diff --git a/app/assets/stylesheets/homepages.scss b/app/assets/stylesheets/homepages.scss new file mode 100644 index 0000000000..e900501a56 --- /dev/null +++ b/app/assets/stylesheets/homepages.scss @@ -0,0 +1,30 @@ +// Place all the styles related to the Homepages controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ +hr { + margin: 0px auto 3rem auto; +} + +.top-ten-container { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-column-gap: 2em; +} + +.top-ten-header { + border-bottom: 2px solid; + border-bottom-color: #B2DFDB; +} + +.spotlight-header { + color: #424242; + +} + +.spotlight { + padding: 0 2rem 2rem 2rem; +} + +.spotlight-link-to { + border-bottom: 2px solid; +} \ No newline at end of file diff --git a/app/controllers/homepages_controller.rb b/app/controllers/homepages_controller.rb new file mode 100644 index 0000000000..f200c8ac2e --- /dev/null +++ b/app/controllers/homepages_controller.rb @@ -0,0 +1,4 @@ +class HomepagesController < ApplicationController + def index + end +end diff --git a/app/helpers/homepages_helper.rb b/app/helpers/homepages_helper.rb new file mode 100644 index 0000000000..4bd8098f37 --- /dev/null +++ b/app/helpers/homepages_helper.rb @@ -0,0 +1,2 @@ +module HomepagesHelper +end diff --git a/app/models/homepage.rb b/app/models/homepage.rb new file mode 100644 index 0000000000..462dd7c777 --- /dev/null +++ b/app/models/homepage.rb @@ -0,0 +1,5 @@ +class Homepage < ApplicationRecord + def self.spotlight + return Work.all.sample + end +end diff --git a/app/views/homepages/index.html.erb b/app/views/homepages/index.html.erb new file mode 100644 index 0000000000..20740ecc22 --- /dev/null +++ b/app/views/homepages/index.html.erb @@ -0,0 +1,31 @@ +
      +

      Media Spotlight +<% spotlight = Homepage.spotlight%> +<%=link_to "#{spotlight.title}", work_path(spotlight), class: "spotlight-link-to"%> by <%="#{spotlight.creator}"%> +

      +

      10 votes: etc

      +
      +
      +
      +
      +

      +Top Movies

      +
        +
      • +
      +
      +
      +

      +Top Books

      +
        +
      • +
      +
      +
      +

      +Top Albums

      +
        +
      • +
      +
      +
      diff --git a/config/routes.rb b/config/routes.rb index e75fd0887f..a13ba85f21 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,7 +1,7 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html resources :works, only: [:index, :new, :create, :show, :edit, :update, :destroy] - + root "homepages#index" get "/login", to: "users#login_form", as: "login" post "/login", to: "users#login" post "/logout", to: "users#logout", as: "logout" diff --git a/db/migrate/20190423235044_create_homepages.rb b/db/migrate/20190423235044_create_homepages.rb new file mode 100644 index 0000000000..bd9ae83d37 --- /dev/null +++ b/db/migrate/20190423235044_create_homepages.rb @@ -0,0 +1,8 @@ +class CreateHomepages < ActiveRecord::Migration[5.2] + def change + create_table :homepages do |t| + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 7fa207d71d..a49caa29ac 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,11 +10,16 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_04_23_212500) do +ActiveRecord::Schema.define(version: 2019_04_23_235044) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "homepages", force: :cascade do |t| + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "users", force: :cascade do |t| t.string "username" t.datetime "created_at", null: false diff --git a/test/controllers/homepages_controller_test.rb b/test/controllers/homepages_controller_test.rb new file mode 100644 index 0000000000..309b927912 --- /dev/null +++ b/test/controllers/homepages_controller_test.rb @@ -0,0 +1,5 @@ +require "test_helper" + +describe HomepagesController do + +end diff --git a/test/fixtures/homepages.yml b/test/fixtures/homepages.yml new file mode 100644 index 0000000000..dc3ee79b5d --- /dev/null +++ b/test/fixtures/homepages.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/models/homepage_test.rb b/test/models/homepage_test.rb new file mode 100644 index 0000000000..f8323f0301 --- /dev/null +++ b/test/models/homepage_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Homepage do + let(:homepage) { Homepage.new } + + it "must be valid" do + value(homepage).must_be :valid? + end +end From f4bb4a710061554d3945d8b0cf639e7bc1d27fa1 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 19:14:36 -0700 Subject: [PATCH 19/59] columns homepage --- app/assets/stylesheets/homepages.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/stylesheets/homepages.scss b/app/assets/stylesheets/homepages.scss index e900501a56..fb13d9d6d7 100644 --- a/app/assets/stylesheets/homepages.scss +++ b/app/assets/stylesheets/homepages.scss @@ -18,7 +18,6 @@ hr { .spotlight-header { color: #424242; - } .spotlight { From 11efc9203efc014a3df6daa5dbbaaabe3b417c14 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 19:27:27 -0700 Subject: [PATCH 20/59] copy and paste update tests from book to work_controller --- test/controllers/works_controller_test.rb | 80 +++++++++++++++++++---- 1 file changed, 68 insertions(+), 12 deletions(-) diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb index 8f83baf007..c7ffa68921 100644 --- a/test/controllers/works_controller_test.rb +++ b/test/controllers/works_controller_test.rb @@ -1,7 +1,6 @@ require "test_helper" describe WorksController do - describe "index" do it "can get the index" do get works_path @@ -38,20 +37,77 @@ end end - it "removes the work from the database" do - work_to_delete = Work.first - expect { - delete work_path(work_to_delete) - }.must_change "Work.count", -1 - must_respond_with :redirect - must_redirect_to works_path + describe "update" do + let(:work_data) { + { + work: { + publication_year: 2234, + }, + } + } + it "changes the data on the model" do + work = works[:custom1] + @book.assign_attributes(book_data[:book]) + expect(@book).must_be :valid? + @book.reload + + # Act + patch book_path(@book), params: book_data + + # Assert + must_respond_with :redirect + must_redirect_to book_path(@book) + + check_flash + + @book.reload + expect(@book.title).must_equal(book_data[:book][:title]) + end + + it "responds with NOT FOUND for a fake book" do + book_id = Book.last.id + 1 + patch book_path(book_id), params: book_data + must_respond_with :not_found + end + + it "responds with BAD REQUEST for bad data" do + # Arrange + book_data[:book][:title] = "" + + # Assumptions + @book.assign_attributes(book_data[:book]) + expect(@book).wont_be :valid? + @book.reload + + # Act + patch book_path(@book), params: book_data + + # Assert + must_respond_with :bad_request + + check_flash(:error) + end + end + + + describe "destroy" do + it "removes the work from the database" do + work_to_delete = Work.first + expect { + delete work_path(work_to_delete) + }.must_change "Work.count", -1 + must_respond_with :redirect + must_redirect_to works_path - check_flash - # check_flash(:error) + check_flash + # check_flash(:error) - after_delete_work = Work.find_by(id: work_to_delete.id) - expect(after_delete_work).must_be_nil + after_delete_work = Work.find_by(id: work_to_delete.id) + expect(after_delete_work).must_be_nil + end end + + end #validate things? use fixtures or let? From fde98ac1898d1c90b35495359a445866f16d8eed Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 20:35:47 -0700 Subject: [PATCH 21/59] create and update work controller tests --- app/controllers/works_controller.rb | 8 ++- test/controllers/works_controller_test.rb | 66 ++++++++++++++--------- test/fixtures/works.yml | 2 + 3 files changed, 50 insertions(+), 26 deletions(-) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 238ae0ac47..b34ad6a7d5 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -11,8 +11,12 @@ def create @work = Work.new(work_params) successful = @work.save if successful + flash[:status] = :success + flash[:message] = "Successfully created media #{@work.id}" redirect_to works_path else + flash[:status] = :error + flash[:message] = "Could not find media with that id: #{params[:id]}" render :new end end @@ -21,8 +25,8 @@ def show @work = Work.find_by(id: params[:id]) unless @work - flash[:status] = :error - flash[:message] = "Could not find media with that id: #{params[:id]}" + flash.now[:status] = :error + flash.now[:message] = "Could not find media with that id: #{params[:id]}" redirect_to works_path return end diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb index c7ffa68921..b97b23693e 100644 --- a/test/controllers/works_controller_test.rb +++ b/test/controllers/works_controller_test.rb @@ -23,6 +23,32 @@ must_respond_with :redirect end end + describe "create" do + it "creates a new work" do + work_data = { + work: { + title: "new title", + category: "album", + creator: "new creator", + publication_year: 1989, + description: "new description", + }, + } + + expect { + post works_path, params: work_data + }.must_change "Work.count", +1 + + must_respond_with :redirect + must_redirect_to works_path + + check_flash + + work = Work.last + expect(work.title).must_equal work_data[:work][:title] + expect(work.publication_year).must_equal work_data[:work][:publication_year] + end + end describe "edit" do it "can get the edit page for an existing work" do @@ -46,50 +72,44 @@ } } it "changes the data on the model" do - work = works[:custom1] - @book.assign_attributes(book_data[:book]) - expect(@book).must_be :valid? - @book.reload + work = Work.first + # work.assign_attributes(work_data[:work]) + # expect(work).must_be :valid? + # work.reload - # Act - patch book_path(@book), params: book_data + patch work_path(work), params: work_data - # Assert must_respond_with :redirect - must_redirect_to book_path(@book) + must_redirect_to work_path(work) check_flash - @book.reload - expect(@book.title).must_equal(book_data[:book][:title]) + work.reload + expect(work.publication_year).must_equal(work_data[:work][:publication_year]) end it "responds with NOT FOUND for a fake book" do - book_id = Book.last.id + 1 - patch book_path(book_id), params: book_data + patch work_path(-1), params: work_data must_respond_with :not_found end it "responds with BAD REQUEST for bad data" do - # Arrange - book_data[:book][:title] = "" + skip + work = Work.first + work_data[:work][:publication_year] = "" - # Assumptions - @book.assign_attributes(book_data[:book]) - expect(@book).wont_be :valid? - @book.reload + work.assign_attributes(work_data[:work]) + expect(work).wont_be :valid? + work.reload - # Act - patch book_path(@book), params: book_data + patch work_path(work), params: work_data - # Assert must_respond_with :bad_request check_flash(:error) end end - describe "destroy" do it "removes the work from the database" do work_to_delete = Work.first @@ -106,8 +126,6 @@ expect(after_delete_work).must_be_nil end end - - end #validate things? use fixtures or let? diff --git a/test/fixtures/works.yml b/test/fixtures/works.yml index ae1ac82e0a..4bd7307cd1 100644 --- a/test/fixtures/works.yml +++ b/test/fixtures/works.yml @@ -20,3 +20,5 @@ custom1: creator: "Jane Austen" publication_year: 1813 description: "Emotional development of protagonist, Elizabeth Bennett" + + \ No newline at end of file From 74b2d274cdf99ea2c7c8e9a0529b93742548ca84 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 20:51:38 -0700 Subject: [PATCH 22/59] work controller new action test --- test/controllers/works_controller_test.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb index b97b23693e..5b4d212787 100644 --- a/test/controllers/works_controller_test.rb +++ b/test/controllers/works_controller_test.rb @@ -23,6 +23,14 @@ must_respond_with :redirect end end + + describe "new" do + it "retruns status code 200" do + get new_work_path + must_respond_with :ok + end + end + describe "create" do it "creates a new work" do work_data = { From 7c9d8f38603f090873e2fccf3895dd88d31aced9 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 21:06:18 -0700 Subject: [PATCH 23/59] if clause added to homepages and works index.html.erb in case there are no works in database --- app/views/homepages/index.html.erb | 2 ++ app/views/works/index.html.erb | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/views/homepages/index.html.erb b/app/views/homepages/index.html.erb index 20740ecc22..e18031dfa9 100644 --- a/app/views/homepages/index.html.erb +++ b/app/views/homepages/index.html.erb @@ -1,6 +1,7 @@

      Media Spotlight <% spotlight = Homepage.spotlight%> +<%if spotlight%> <%=link_to "#{spotlight.title}", work_path(spotlight), class: "spotlight-link-to"%> by <%="#{spotlight.creator}"%>

      10 votes: etc

      @@ -28,4 +29,5 @@ Top Albums
    +<%end%> diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb index a2796f4107..5914f27bef 100644 --- a/app/views/works/index.html.erb +++ b/app/views/works/index.html.erb @@ -1,5 +1,6 @@

    List of Works

    +<% if @works != []%> <%Work.category(@works).each do |category|%>

    <%=category.capitalize+"s"%>

    @@ -28,6 +29,7 @@
    <%end%> +<%end%>
    \ No newline at end of file From ecf62b416cec0135480f581f589f45047e47a78c Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Tue, 23 Apr 2019 21:17:55 -0700 Subject: [PATCH 24/59] validation to work and user added --- app/models/user.rb | 2 ++ app/models/work.rb | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index 379658a509..0e919ff1db 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,2 +1,4 @@ class User < ApplicationRecord + validates :username, presence: true + end diff --git a/app/models/work.rb b/app/models/work.rb index ca7be98e84..294017da64 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -1,5 +1,11 @@ class Work < ApplicationRecord - def self.category(works) + + validates :title, presence: true + validates :publication_year, presence: true + validates :creator, presence: true + validates :category, presence: true + validates :description, presence: true + def self.category(works) hash = Hash.new { } works.each do |work| category = work.category From c41ec6299e5a12b0c67cfaf07fd00e47e8b1ca6b Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Wed, 24 Apr 2019 14:35:26 -0700 Subject: [PATCH 25/59] work controller filters --- app/assets/stylesheets/application.scss | 10 ++++- app/controllers/users_controller.rb | 4 +- app/controllers/works_controller.rb | 52 +++++++++++++++---------- app/views/works/_form.html.erb | 2 +- app/views/works/show.html.erb | 4 +- config/routes.rb | 1 + 6 files changed, 48 insertions(+), 25 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 86c8d17795..d9c472c4c9 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -38,6 +38,7 @@ margin-block-end: 0.67em; margin-inline-start: 0px; margin-inline-end: 0px; + text-align: center; } .overall-header h1 a { @@ -51,8 +52,11 @@ color: white; border-right: none; } + nav { display: flex; + flex-direction: row; + justify-content: space-between; } .overall-header .nav-link { @@ -72,8 +76,12 @@ ul { // margin-inline-start: 0px; // margin-inline-end: 0px; } +.btn-primary { + background-color: #26A69A; + border-color: #26A69A; +} -.btn { +.btn:hover { background-color: #26A69A; border-color: #26A69A; } diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 363900c4fb..6c7c8da9f7 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -25,11 +25,11 @@ def current flash[:status] = :error flash[:message] = "You must be logged in to see this page." end - # redirect_to root_path + redirect_to root_path end def logout session[:user_id] = nil - redirect_to works_path + redirect_to root_path end end diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index b34ad6a7d5..831a71d124 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -1,4 +1,6 @@ class WorksController < ApplicationController + + before_action :find_work, only: [:show, :edit, :update] def index @works = Work.all end @@ -21,34 +23,34 @@ def create end end - def show - @work = Work.find_by(id: params[:id]) +# def show + # @work = Work.find_by(id: params[:id]) - unless @work - flash.now[:status] = :error - flash.now[:message] = "Could not find media with that id: #{params[:id]}" - redirect_to works_path - return - end + # unless @work + # flash.now[:status] = :error + # flash.now[:message] = "Could not find media with that id: #{params[:id]}" + # redirect_to works_path + # return + # end # @unrated_trip = @passenger.trips.find_by(rating: nil) # @trip = Trip.new # @trips = @passenger.trips - end +# end - def edit - @work = Work.find_by(id: params[:id]) - unless @work - redirect_to works_path, flash: { error: "Could not find media with id: #{params[:id]}" } - end - end +# def edit + # @work = Work.find_by(id: params[:id]) + # unless @work + # redirect_to works_path, flash: { error: "Could not find media with id: #{params[:id]}" } + # end +# end def update - @work = Work.find_by(id: params[:id]) - unless @work - head :not_found - return - end + # @work = Work.find_by(id: params[:id]) + # unless @work + # head :not_found + # return + # end if @work.update(work_params) flash[:status] = :success flash[:message] = "Successfully updated media #{@work.id}" @@ -78,4 +80,14 @@ def destroy def work_params return params.require(:work).permit(:category, :title, :creator, :publication_year, :description) end + + def find_work + @work = Work.find_by(id: params[:id]) + unless @work + flash.now[:status] = :error + flash.now[:message] = "Could not find media with that id: #{params[:id]}" + redirect_to works_path + return + end + end end diff --git a/app/views/works/_form.html.erb b/app/views/works/_form.html.erb index 91b14f3643..48949d74e3 100644 --- a/app/views/works/_form.html.erb +++ b/app/views/works/_form.html.erb @@ -15,7 +15,7 @@ <%= form_with model: @work do |f| %>
    <%=f.label :category, "Category"%> - <%= f.select :category, ["album", "movie", "book"], class: "form-control"%> + <%= f.select :category, ["album", "movie", "book"], {}, {:class => "form-control"}%>
    <%=f.label :title, "Title:" %> diff --git a/app/views/works/show.html.erb b/app/views/works/show.html.erb index a52286accf..d3b778c116 100644 --- a/app/views/works/show.html.erb +++ b/app/views/works/show.html.erb @@ -2,6 +2,8 @@

    Created by: <%=@work.creator%>

    Published: <%= @work.publication_year %>

    <%=@work.description%> +

    <%= link_to 'Back to media ranks', works_path, class: "btn btn-primary"%> <%= link_to "Edit", edit_work_path(@work.id), class: "btn btn-primary" %> -<%= link_to "Delete", work_path(@work.id), class:"btn btn-primary", method: :delete, confirm: "Are you sure?" %> \ No newline at end of file +<%= link_to "Delete", work_path(@work.id), class:"btn btn-danger", method: :delete, confirm: "Are you sure?" %> +
    \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index a13ba85f21..494381ad14 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,6 +2,7 @@ # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html resources :works, only: [:index, :new, :create, :show, :edit, :update, :destroy] root "homepages#index" + get "/login", to: "users#login_form", as: "login" post "/login", to: "users#login" post "/logout", to: "users#logout", as: "logout" From 2d542fee112dba78a37e4e55b5382b61d82d3ab2 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Wed, 24 Apr 2019 15:39:52 -0700 Subject: [PATCH 26/59] user controller tests for session id and request to users current --- test/fixtures/users.yml | 3 +++ test/models/user_test.rb | 12 ++++++++++-- test/models/work_test.rb | 14 ++++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index 952febd97d..6e650cc989 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -5,3 +5,6 @@ one: two: username: MyString + +custom1: + username: cyndilopez6 diff --git a/test/models/user_test.rb b/test/models/user_test.rb index cc862ac2d9..991f009642 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -3,7 +3,15 @@ describe User do let(:user) { User.new } - it "must be valid" do - value(user).must_be :valid? + describe "validations" do + it "rejects validations with bad data" do + expect(user.valid?).must_equal false + expect(user.errors.messages[:username][0]).must_equal "can't be blank" + end + + it "passes validations with good data" do + user = users(:custom1) + expect(user).must_be :valid? + end end end diff --git a/test/models/work_test.rb b/test/models/work_test.rb index f6fba7104d..5e30ebdb92 100644 --- a/test/models/work_test.rb +++ b/test/models/work_test.rb @@ -3,7 +3,17 @@ describe Work do let(:work) { Work.new } - it "must be valid" do - value(work).must_be :valid? + describe "validations" do + it "rejects validations with bad data" do + work + expect(work.valid?).must_equal false + expect(work.errors.messages[:title][0]).must_equal "can't be blank" + expect(work.errors.messages[:category][0]).must_equal "can't be blank" + end + + it "passes validations with good data" do + work = works(:custom1) + expect(work).must_be :valid? + end end end From bea5ee0a2bfc3e09f29155f7e2e26be71c965bb7 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Thu, 25 Apr 2019 09:44:10 -0700 Subject: [PATCH 27/59] styling --- app/assets/stylesheets/application.scss | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index d9c472c4c9..248536e3ed 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -16,6 +16,9 @@ /* Import scss content */ @import "**/*"; +/* Impoty Gudea font from google */ +@import url('https://fonts.googleapis.com/css?family=Gudea'); + // .content { // grid-template-rows: 150px 1; // } @@ -90,10 +93,25 @@ h2, a, h3 { color: #26A69A; } +h2 { + font-size: 2rem; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: 900; + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.2; + + } + h1, h2, h3, h4, h5 { - font-weight: bold; + font-family: 'Gudea', sans-serif; + } + + p { margin-top: 0; margin-bottom: 1rem; From be7f4e85eff1f0f66c921763c6c6478b74427f30 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Thu, 25 Apr 2019 13:13:56 -0700 Subject: [PATCH 28/59] added user model and controller, references to votes in user and work models --- app/assets/javascripts/votes.js | 2 ++ app/assets/stylesheets/votes.scss | 3 +++ app/controllers/votes_controller.rb | 2 ++ app/helpers/votes_helper.rb | 2 ++ app/models/user.rb | 4 ++-- app/models/vote.rb | 4 ++++ app/models/work.rb | 13 +++++++------ db/migrate/20190425201115_create_votes.rb | 10 ++++++++++ test/controllers/votes_controller_test.rb | 7 +++++++ test/fixtures/votes.yml | 9 +++++++++ test/models/vote_test.rb | 9 +++++++++ 11 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 app/assets/javascripts/votes.js create mode 100644 app/assets/stylesheets/votes.scss create mode 100644 app/controllers/votes_controller.rb create mode 100644 app/helpers/votes_helper.rb create mode 100644 app/models/vote.rb create mode 100644 db/migrate/20190425201115_create_votes.rb create mode 100644 test/controllers/votes_controller_test.rb create mode 100644 test/fixtures/votes.yml create mode 100644 test/models/vote_test.rb diff --git a/app/assets/javascripts/votes.js b/app/assets/javascripts/votes.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/votes.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/votes.scss b/app/assets/stylesheets/votes.scss new file mode 100644 index 0000000000..9a6720f80e --- /dev/null +++ b/app/assets/stylesheets/votes.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Votes controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb new file mode 100644 index 0000000000..ffdb2760e0 --- /dev/null +++ b/app/controllers/votes_controller.rb @@ -0,0 +1,2 @@ +class VotesController < ApplicationController +end diff --git a/app/helpers/votes_helper.rb b/app/helpers/votes_helper.rb new file mode 100644 index 0000000000..5a82eed07d --- /dev/null +++ b/app/helpers/votes_helper.rb @@ -0,0 +1,2 @@ +module VotesHelper +end diff --git a/app/models/user.rb b/app/models/user.rb index 0e919ff1db..be0d77815c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,4 +1,4 @@ class User < ApplicationRecord - validates :username, presence: true - + validates :username, presence: true + has_many :votes end diff --git a/app/models/vote.rb b/app/models/vote.rb new file mode 100644 index 0000000000..b8b6f9f0aa --- /dev/null +++ b/app/models/vote.rb @@ -0,0 +1,4 @@ +class Vote < ApplicationRecord + belongs_to :user + belongs_to :work +end diff --git a/app/models/work.rb b/app/models/work.rb index 294017da64..bfb028e9f1 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -1,11 +1,12 @@ class Work < ApplicationRecord + validates :title, presence: true + validates :publication_year, presence: true + validates :creator, presence: true + validates :category, presence: true + validates :description, presence: true - validates :title, presence: true - validates :publication_year, presence: true - validates :creator, presence: true - validates :category, presence: true - validates :description, presence: true - def self.category(works) + has_many :votes + def self.category(works) hash = Hash.new { } works.each do |work| category = work.category diff --git a/db/migrate/20190425201115_create_votes.rb b/db/migrate/20190425201115_create_votes.rb new file mode 100644 index 0000000000..5b84adc296 --- /dev/null +++ b/db/migrate/20190425201115_create_votes.rb @@ -0,0 +1,10 @@ +class CreateVotes < ActiveRecord::Migration[5.2] + def change + create_table :votes do |t| + t.references :user, foreign_key: true + t.references :work, foreign_key: true + + t.timestamps + end + end +end diff --git a/test/controllers/votes_controller_test.rb b/test/controllers/votes_controller_test.rb new file mode 100644 index 0000000000..cf4d03935f --- /dev/null +++ b/test/controllers/votes_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe VotesController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/fixtures/votes.yml b/test/fixtures/votes.yml new file mode 100644 index 0000000000..b5db71052e --- /dev/null +++ b/test/fixtures/votes.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + user: one + work: one + +two: + user: two + work: two diff --git a/test/models/vote_test.rb b/test/models/vote_test.rb new file mode 100644 index 0000000000..fc15947bd3 --- /dev/null +++ b/test/models/vote_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Vote do + let(:vote) { Vote.new } + + it "must be valid" do + value(vote).must_be :valid? + end +end From 9206a5586f9185688aae6e6e13b9edc2c1c5e35d Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Thu, 25 Apr 2019 13:15:13 -0700 Subject: [PATCH 29/59] migrated votes model creation --- db/schema.rb | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/db/schema.rb b/db/schema.rb index a49caa29ac..5db114bdad 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_04_23_235044) do +ActiveRecord::Schema.define(version: 2019_04_25_201115) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -26,6 +26,15 @@ t.datetime "updated_at", null: false end + create_table "votes", force: :cascade do |t| + t.bigint "user_id" + t.bigint "work_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["user_id"], name: "index_votes_on_user_id" + t.index ["work_id"], name: "index_votes_on_work_id" + end + create_table "works", force: :cascade do |t| t.string "category" t.string "title" @@ -36,4 +45,6 @@ t.datetime "updated_at", null: false end + add_foreign_key "votes", "users" + add_foreign_key "votes", "works" end From f3916a4d2c49cd2c38dbb5d404f547057f4963e6 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Thu, 25 Apr 2019 13:16:43 -0700 Subject: [PATCH 30/59] create and vote params method in votes controller --- app/controllers/votes_controller.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb index ffdb2760e0..58724f3a4c 100644 --- a/app/controllers/votes_controller.rb +++ b/app/controllers/votes_controller.rb @@ -1,2 +1,10 @@ class VotesController < ApplicationController + + def create + vote = Vote.create(vote_params) + end + + def vote_params + params.require(:vote).permit(:user_id, :work_id) + end end From 9f8322614689501bf0a82ff7c2978883cc6f3eb2 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Thu, 25 Apr 2019 13:53:27 -0700 Subject: [PATCH 31/59] changed work show file to have upvote button. debugged vote create bug --- app/controllers/votes_controller.rb | 21 ++++++++++++++++----- app/views/works/index.html.erb | 2 +- app/views/works/show.html.erb | 1 + config/routes.rb | 6 +++++- test/controllers/users_controller_test.rb | 16 ++++++++++++++++ 5 files changed, 39 insertions(+), 7 deletions(-) diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb index 58724f3a4c..5de25915ac 100644 --- a/app/controllers/votes_controller.rb +++ b/app/controllers/votes_controller.rb @@ -1,10 +1,21 @@ class VotesController < ApplicationController + def create + @vote = Vote.new + if session[:user_id] + user_id = session[:user_id] + @vote.user_id = user_id + @vote.work_id = params[:work_id] + check_unique_work(user_id, work_id) + work_id = params[:work_id] + p @vote.work_id + @vote.save + redirect_to works_path + else - def create - vote = Vote.create(vote_params) end + end - def vote_params - params.require(:vote).permit(:user_id, :work_id) - end + def vote_params + params.require(:vote).permit(:user_id, :work_id) + end end diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb index 5914f27bef..341a427aa6 100644 --- a/app/views/works/index.html.erb +++ b/app/views/works/index.html.erb @@ -22,7 +22,7 @@ <%=work.creator%> <%=work.publication_year%> <%end%> - + <%=link_to "Upvote", work_votes_path(work.id), method: :post %> <% end %> diff --git a/app/views/works/show.html.erb b/app/views/works/show.html.erb index d3b778c116..956c149e3c 100644 --- a/app/views/works/show.html.erb +++ b/app/views/works/show.html.erb @@ -5,5 +5,6 @@
    <%= link_to 'Back to media ranks', works_path, class: "btn btn-primary"%> <%= link_to "Edit", edit_work_path(@work.id), class: "btn btn-primary" %> +<%= link_to "Upvote", work_votes_path(@work.id), method: :post, class: "btn btn-primary"%> <%= link_to "Delete", work_path(@work.id), class:"btn btn-danger", method: :delete, confirm: "Are you sure?" %>
    \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 494381ad14..f687edc8b4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,9 +2,13 @@ # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html resources :works, only: [:index, :new, :create, :show, :edit, :update, :destroy] root "homepages#index" - + get "/login", to: "users#login_form", as: "login" post "/login", to: "users#login" post "/logout", to: "users#logout", as: "logout" get "/users/current", to: "users#current", as: "current_user" + + resources :works do + resources :votes, only: [:create] + end end diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index 61354e2d19..afcfa46d6a 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -1,12 +1,28 @@ require "test_helper" describe UsersController do + describe "current do" it "gets the login path" do get login_path must_respond_with :success end + it "returns 200 OK for a logged-in user" do + user = User.first + login_data = { + user: { + username: user.username + } + } + + post login_path, params: login_data + + expect(session[:user_id]).must_equal user.id + + get current_user_path + + must_respond_with :success # it "successfully logs a user in" do # username = "cyndi" # user = User.create(username: username) From 3222005eaf5c67c827a91aff20cdbede9b8fa259 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Thu, 25 Apr 2019 14:07:34 -0700 Subject: [PATCH 32/59] voting logic to votes controller and model --- app/controllers/votes_controller.rb | 16 ++++++++++------ app/models/vote.rb | 10 ++++++++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb index 5de25915ac..b2b843ca23 100644 --- a/app/controllers/votes_controller.rb +++ b/app/controllers/votes_controller.rb @@ -1,17 +1,21 @@ class VotesController < ApplicationController def create @vote = Vote.new + work_id = params[:work_id] if session[:user_id] user_id = session[:user_id] @vote.user_id = user_id @vote.work_id = params[:work_id] - check_unique_work(user_id, work_id) - work_id = params[:work_id] - p @vote.work_id - @vote.save - redirect_to works_path + if check_unique_work(user_id, work_id) + @vote.save + redirect_to works_path + else + flash[:status] = :error + flash[:message] = "user: has already voted for this work" + end else - + flash[:status] = :error + flash[:message] = "A problem occurred: You must log in to do that." end end diff --git a/app/models/vote.rb b/app/models/vote.rb index b8b6f9f0aa..d7599f09d3 100644 --- a/app/models/vote.rb +++ b/app/models/vote.rb @@ -1,4 +1,14 @@ class Vote < ApplicationRecord belongs_to :user belongs_to :work + + def check_unique_work(user_id, work_id) + user = User.find(user_id) + vote = Vote.find_by(user: user_id) + if vote.work_id == work_id + return false + else + return true + end + end end From b280c148b72863d6aa616ba326e68dddde60ff62 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Thu, 25 Apr 2019 15:54:52 -0700 Subject: [PATCH 33/59] business logic for getting the top ten works --- app/assets/stylesheets/homepages.scss | 6 +++++- app/controllers/votes_controller.rb | 2 +- app/models/vote.rb | 9 ++++++++- app/models/work.rb | 22 +++++++++++++++++++++- app/views/homepages/index.html.erb | 27 +++++++++++---------------- app/views/works/index.html.erb | 7 +++++-- test/fixtures/votes.yml | 2 ++ 7 files changed, 53 insertions(+), 22 deletions(-) diff --git a/app/assets/stylesheets/homepages.scss b/app/assets/stylesheets/homepages.scss index fb13d9d6d7..ddaaf154f2 100644 --- a/app/assets/stylesheets/homepages.scss +++ b/app/assets/stylesheets/homepages.scss @@ -26,4 +26,8 @@ hr { .spotlight-link-to { border-bottom: 2px solid; -} \ No newline at end of file +} + +.list-group-item { + border: none; + } \ No newline at end of file diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb index b2b843ca23..7a4c166244 100644 --- a/app/controllers/votes_controller.rb +++ b/app/controllers/votes_controller.rb @@ -6,7 +6,7 @@ def create user_id = session[:user_id] @vote.user_id = user_id @vote.work_id = params[:work_id] - if check_unique_work(user_id, work_id) + if Vote.check_unique_work(user_id, work_id) @vote.save redirect_to works_path else diff --git a/app/models/vote.rb b/app/models/vote.rb index d7599f09d3..15095c9b1e 100644 --- a/app/models/vote.rb +++ b/app/models/vote.rb @@ -2,7 +2,7 @@ class Vote < ApplicationRecord belongs_to :user belongs_to :work - def check_unique_work(user_id, work_id) + def self.check_unique_work(user_id, work_id) user = User.find(user_id) vote = Vote.find_by(user: user_id) if vote.work_id == work_id @@ -11,4 +11,11 @@ def check_unique_work(user_id, work_id) return true end end + + # def sort_votes_descending + # votes_hash = Hash.new + # @votes.each do |vote| + # work = Work.find_by(vote.work_id) + # end + # end end diff --git a/app/models/work.rb b/app/models/work.rb index bfb028e9f1..08fde939bb 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -6,7 +6,8 @@ class Work < ApplicationRecord validates :description, presence: true has_many :votes - def self.category(works) + def self.category + works = Work.all hash = Hash.new { } works.each do |work| category = work.category @@ -16,4 +17,23 @@ def self.category(works) end return hash.keys.sort end + + def self.media_votes(category) + media_count_hash = {} + works = Work.all + works.each do |work| + if work.category == category + num_votes = work.votes.count + media_count_hash[work] = num_votes + end + end + media_count = self.top_ten_media_descending(media_count_hash) + return media_count + end + + def self.top_ten_media_descending(media_count) + media_count = media_count.sort_by { |work, count| count } + media_count.reverse! + return media_count[0,9] + end end diff --git a/app/views/homepages/index.html.erb b/app/views/homepages/index.html.erb index e18031dfa9..f3d3d89700 100644 --- a/app/views/homepages/index.html.erb +++ b/app/views/homepages/index.html.erb @@ -8,26 +8,21 @@
    +<%Work.category.each do |category|%> +<% media_count = Work.media_votes(category)%>

    -Top Movies

    +Top <%=category.capitalize+"s"%>
      -
    • -
    -
    -
    -

    -Top Books

    -
      -
    • -
    -
    -
    -

    -Top Albums

    -
    <%end%>
    + + + + +<%end%> diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb index 341a427aa6..d649897378 100644 --- a/app/views/works/index.html.erb +++ b/app/views/works/index.html.erb @@ -1,7 +1,8 @@

    List of Works

    <% if @works != []%> -<%Work.category(@works).each do |category|%> +<%Work.category.each do |category|%> +

    <%=category.capitalize+"s"%>

    @@ -21,9 +22,11 @@ - <%end%> + + <%end%> + <% end %> diff --git a/test/fixtures/votes.yml b/test/fixtures/votes.yml index b5db71052e..fe669a75af 100644 --- a/test/fixtures/votes.yml +++ b/test/fixtures/votes.yml @@ -7,3 +7,5 @@ one: two: user: two work: two + + From 85fe23bb07080569b58fc6abb4d1d63f8a7cbb20 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Thu, 25 Apr 2019 16:59:22 -0700 Subject: [PATCH 34/59] top ten method for work --- app/models/homepage.rb | 2 +- app/models/work.rb | 20 ++++---------------- app/views/homepages/index.html.erb | 2 +- db/schema.rb | 2 ++ 4 files changed, 8 insertions(+), 18 deletions(-) diff --git a/app/models/homepage.rb b/app/models/homepage.rb index 462dd7c777..b32e2c6292 100644 --- a/app/models/homepage.rb +++ b/app/models/homepage.rb @@ -1,5 +1,5 @@ class Homepage < ApplicationRecord def self.spotlight - return Work.all.sample + return Work.where(category: "album").left_joins(:votes).group(:id).order("COUNT(votes.id) DESC").limit(1)[0] end end diff --git a/app/models/work.rb b/app/models/work.rb index 08fde939bb..cfae67b82a 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -6,6 +6,8 @@ class Work < ApplicationRecord validates :description, presence: true has_many :votes + has_many :users, through: :votes + def self.category works = Work.all hash = Hash.new { } @@ -19,21 +21,7 @@ def self.category end def self.media_votes(category) - media_count_hash = {} - works = Work.all - works.each do |work| - if work.category == category - num_votes = work.votes.count - media_count_hash[work] = num_votes - end - end - media_count = self.top_ten_media_descending(media_count_hash) - return media_count - end - - def self.top_ten_media_descending(media_count) - media_count = media_count.sort_by { |work, count| count } - media_count.reverse! - return media_count[0,9] + works = Work.where(category: "album").left_joins(:votes).select("works.*, COUNT(votes.id) as vote_count").group(:id).order("COUNT(votes.id) DESC").limit(10) + return works end end diff --git a/app/views/homepages/index.html.erb b/app/views/homepages/index.html.erb index f3d3d89700..b8ffc14b71 100644 --- a/app/views/homepages/index.html.erb +++ b/app/views/homepages/index.html.erb @@ -15,7 +15,7 @@ Top <%=category.capitalize+"s"%> diff --git a/db/schema.rb b/db/schema.rb index 5db114bdad..7bc78345d0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -47,4 +47,6 @@ add_foreign_key "votes", "users" add_foreign_key "votes", "works" + + # add_index "votes", ["user_id", "work_id"], :unique => true end From 3b0a6ce7eb675d4cdd7df26ba22249aa1d7ce106 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Thu, 25 Apr 2019 20:29:02 -0700 Subject: [PATCH 35/59] index to make user_id and work_id unique for given vote --- app/controllers/votes_controller.rb | 7 +++++-- db/migrate/20190426000050_add_index_votes.rb | 5 +++++ db/schema.rb | 5 ++--- 3 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20190426000050_add_index_votes.rb diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb index 7a4c166244..a95ab6c975 100644 --- a/app/controllers/votes_controller.rb +++ b/app/controllers/votes_controller.rb @@ -6,16 +6,19 @@ def create user_id = session[:user_id] @vote.user_id = user_id @vote.work_id = params[:work_id] - if Vote.check_unique_work(user_id, work_id) + # if Vote.check_unique_work(user_id, work_id) + begin @vote.save redirect_to works_path - else + rescue ActiveRecord::RecordNotUnique flash[:status] = :error flash[:message] = "user: has already voted for this work" + redirect_to work_path(work_id) end else flash[:status] = :error flash[:message] = "A problem occurred: You must log in to do that." + redirect_to work_path(work_id) end end diff --git a/db/migrate/20190426000050_add_index_votes.rb b/db/migrate/20190426000050_add_index_votes.rb new file mode 100644 index 0000000000..a79ed88d7c --- /dev/null +++ b/db/migrate/20190426000050_add_index_votes.rb @@ -0,0 +1,5 @@ +class AddIndexVotes < ActiveRecord::Migration[5.2] + def change + add_index "votes", ["user_id", "work_id"], :unique => true + end +end diff --git a/db/schema.rb b/db/schema.rb index 7bc78345d0..d061389005 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_04_25_201115) do +ActiveRecord::Schema.define(version: 2019_04_26_000050) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -31,6 +31,7 @@ t.bigint "work_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.index ["user_id", "work_id"], name: "index_votes_on_user_id_and_work_id", unique: true t.index ["user_id"], name: "index_votes_on_user_id" t.index ["work_id"], name: "index_votes_on_work_id" end @@ -47,6 +48,4 @@ add_foreign_key "votes", "users" add_foreign_key "votes", "works" - - # add_index "votes", ["user_id", "work_id"], :unique => true end From 6d8a413a6d77416ea52ffa862a35c1776b65df5a Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Thu, 25 Apr 2019 21:11:11 -0700 Subject: [PATCH 36/59] changed logic to select all works from one category and order them by vote count. added buttons at bottom page for works_path --- app/models/homepage.rb | 2 +- app/models/work.rb | 24 ++++++++++++++---------- app/views/homepages/index.html.erb | 6 ++++-- app/views/works/index.html.erb | 19 +++++++++---------- 4 files changed, 28 insertions(+), 23 deletions(-) diff --git a/app/models/homepage.rb b/app/models/homepage.rb index b32e2c6292..f165585a2b 100644 --- a/app/models/homepage.rb +++ b/app/models/homepage.rb @@ -1,5 +1,5 @@ class Homepage < ApplicationRecord def self.spotlight - return Work.where(category: "album").left_joins(:votes).group(:id).order("COUNT(votes.id) DESC").limit(1)[0] + return Work.left_joins(:votes).select("works.*, COUNT(votes.id) as vote_count").group(:id).order("COUNT(votes.id) DESC").limit(1)[0] end end diff --git a/app/models/work.rb b/app/models/work.rb index cfae67b82a..6c16d44a39 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -9,19 +9,23 @@ class Work < ApplicationRecord has_many :users, through: :votes def self.category - works = Work.all - hash = Hash.new { } - works.each do |work| - category = work.category - if !hash.include?(category) - hash[category] = 1 - end - end - return hash.keys.sort + return ["album", "book", "movie"] end + # def self.list_sorted_media_per_category(category) + # works = Work.where(category: category).vot + # end + + # def self.vote_count(work) + # return work.votes.count + # end + def self.media_votes(category) - works = Work.where(category: "album").left_joins(:votes).select("works.*, COUNT(votes.id) as vote_count").group(:id).order("COUNT(votes.id) DESC").limit(10) + works = Work.where(category: category).left_joins(:votes).select("works.*, COUNT(votes.id) as vote_count").group(:id).order("COUNT(votes.id) DESC").limit(10) return works end + + def self.top_ten_media_votes(category) + return self.media_votes(category).limit(10) + end end diff --git a/app/views/homepages/index.html.erb b/app/views/homepages/index.html.erb index b8ffc14b71..f3ae0d0c5f 100644 --- a/app/views/homepages/index.html.erb +++ b/app/views/homepages/index.html.erb @@ -4,12 +4,12 @@ <%if spotlight%> <%=link_to "#{spotlight.title}", work_path(spotlight), class: "spotlight-link-to"%> by <%="#{spotlight.creator}"%> -

    10 votes: etc

    +

    <%=spotlight.vote_count%> votes -


    <%Work.category.each do |category|%> -<% media_count = Work.media_votes(category)%> +<% media_count = Work.top_ten_media_votes(category)%>

    Top <%=category.capitalize+"s"%>

    @@ -19,6 +19,8 @@ Top <%=category.capitalize+"s"%> <%end%>
    +<%else%> +

    No Media Spotlight Yet

    <%end%>
    diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb index d649897378..bf2a83c38b 100644 --- a/app/views/works/index.html.erb +++ b/app/views/works/index.html.erb @@ -1,30 +1,28 @@

    List of Works

    -<% if @works != []%> <%Work.category.each do |category|%>

    <%=category.capitalize+"s"%>

    <%=link_to "#{work.title}", work_path(work.id), method: :get %> <%=work.creator%> <%=work.publication_year%><%=link_to "Upvote", work_votes_path(work.id), method: :post %>
    -<%# %> + -<%# %> + +<% works = Work.media_votes(category)%> +<% if works != []%> - -<% @works.each do |work|%> +<% works.each do |work|%> - - <% if work.category == category%> + - + - <%end%> @@ -33,6 +31,7 @@
    VotesVotes Title Created By PublishedUpvoteUpvote
    <%=work.vote_count%> <%=link_to "#{work.title}", work_path(work.id), method: :get %> <%=work.creator%> <%=work.publication_year%><%=link_to "Upvote", work_votes_path(work.id), method: :post %><%=link_to "Upvote", work_votes_path(work.id), method: :post, class: "btn btn-primary" %>
    <%end%> <%end%> - +<%=link_to "View top media", "/", class: "btn btn-secondary"%> +<%=link_to "Add a new work", new_work_path, class: "btn btn-primary"%>
    \ No newline at end of file From 3f0138735f39e20b6e4345be7349ac9e29b4ba1c Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Thu, 25 Apr 2019 22:45:32 -0700 Subject: [PATCH 37/59] added method in vote model to return vote given user id and work id. html code in work details page to display votes per work and table of users and date voted --- app/assets/stylesheets/application.scss | 8 ++++++++ app/assets/stylesheets/homepages.scss | 4 ++++ app/assets/stylesheets/works.scss | 6 ++++++ app/models/vote.rb | 9 +++------ app/models/work.rb | 12 +++++------- app/views/homepages/index.html.erb | 11 ++++++----- app/views/works/show.html.erb | 16 ++++++++++++++++ 7 files changed, 48 insertions(+), 18 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 248536e3ed..ae6b40246f 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -122,3 +122,11 @@ main { display: block; } +.btn:hover { + background-color: #00796B; + color: white; +} + +.btn-danger:hover { + border-color: #bd2130; +} \ No newline at end of file diff --git a/app/assets/stylesheets/homepages.scss b/app/assets/stylesheets/homepages.scss index ddaaf154f2..531b18914c 100644 --- a/app/assets/stylesheets/homepages.scss +++ b/app/assets/stylesheets/homepages.scss @@ -30,4 +30,8 @@ hr { .list-group-item { border: none; + } + + .top-ten-creator { + color: slategrey; } \ No newline at end of file diff --git a/app/assets/stylesheets/works.scss b/app/assets/stylesheets/works.scss index 5618452f3e..de6e677177 100644 --- a/app/assets/stylesheets/works.scss +++ b/app/assets/stylesheets/works.scss @@ -1,3 +1,9 @@ // Place all the styles related to the Works controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ +.work-votes-container { + margin-top: 2rem; +} +.work-votes-header { + color: black; +} \ No newline at end of file diff --git a/app/models/vote.rb b/app/models/vote.rb index 15095c9b1e..15614bdd58 100644 --- a/app/models/vote.rb +++ b/app/models/vote.rb @@ -12,10 +12,7 @@ def self.check_unique_work(user_id, work_id) end end - # def sort_votes_descending - # votes_hash = Hash.new - # @votes.each do |vote| - # work = Work.find_by(vote.work_id) - # end - # end + def self.vote(user, work) + return Vote.find_by(user_id: user.id, work_id: work.id) + end end diff --git a/app/models/work.rb b/app/models/work.rb index 6c16d44a39..dd962e2283 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -12,13 +12,6 @@ def self.category return ["album", "book", "movie"] end - # def self.list_sorted_media_per_category(category) - # works = Work.where(category: category).vot - # end - - # def self.vote_count(work) - # return work.votes.count - # end def self.media_votes(category) works = Work.where(category: category).left_joins(:votes).select("works.*, COUNT(votes.id) as vote_count").group(:id).order("COUNT(votes.id) DESC").limit(10) @@ -28,4 +21,9 @@ def self.media_votes(category) def self.top_ten_media_votes(category) return self.media_votes(category).limit(10) end + + def self.media_vote_count(work) + return work.votes.count + end + end diff --git a/app/views/homepages/index.html.erb b/app/views/homepages/index.html.erb index f3ae0d0c5f..2b10f90f79 100644 --- a/app/views/homepages/index.html.erb +++ b/app/views/homepages/index.html.erb @@ -1,7 +1,7 @@

    Media Spotlight <% spotlight = Homepage.spotlight%> -<%if spotlight%> +<% if spotlight %> <%=link_to "#{spotlight.title}", work_path(spotlight), class: "spotlight-link-to"%> by <%="#{spotlight.creator}"%>

    <%=spotlight.vote_count%> votes -

    @@ -12,19 +12,20 @@ <% media_count = Work.top_ten_media_votes(category)%>

    -Top <%=category.capitalize+"s"%>

    +Top <%=category.capitalize+"s"%> +
    +<%end%> +
    <%else%>

    No Media Spotlight Yet

    <%end%> - -<%end%> diff --git a/app/views/works/show.html.erb b/app/views/works/show.html.erb index 956c149e3c..4c52767c67 100644 --- a/app/views/works/show.html.erb +++ b/app/views/works/show.html.erb @@ -7,4 +7,20 @@ <%= link_to "Edit", edit_work_path(@work.id), class: "btn btn-primary" %> <%= link_to "Upvote", work_votes_path(@work.id), method: :post, class: "btn btn-primary"%> <%= link_to "Delete", work_path(@work.id), class:"btn btn-danger", method: :delete, confirm: "Are you sure?" %> + +
    +

    <%=Work.media_vote_count(@work)%> Votes for this <%=@work.category.capitalize%>

    + + + + + + +<%@work.users.each do |user|%> + + + +<%end%> +
    UserDate
    <%=link_to "#{user.username}"%><%=Vote.vote(user,@work).created_at.to_date.to_formatted_s(:rfc822)%> +
    \ No newline at end of file From ea47d487a420f23ae93b343551d50e4480f41cb9 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Fri, 26 Apr 2019 08:43:29 -0700 Subject: [PATCH 38/59] changed font --- app/assets/stylesheets/application.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 248536e3ed..c1518c432b 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -17,7 +17,7 @@ @import "**/*"; /* Impoty Gudea font from google */ -@import url('https://fonts.googleapis.com/css?family=Gudea'); +@import url('https://fonts.googleapis.com/css?family=Gudea:400,700'); // .content { // grid-template-rows: 150px 1; From dce2868905332dc036c24b11cb2ec07080b50474 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Fri, 26 Apr 2019 11:02:29 -0700 Subject: [PATCH 39/59] login as username button on nav bar, font for body changed to Gudea, model method that returns user associated with session user id --- app/assets/stylesheets/application.scss | 2 +- app/assets/stylesheets/homepages.scss | 4 ++++ app/assets/stylesheets/works.scss | 2 +- app/models/user.rb | 5 +++++ app/views/layouts/application.html.erb | 3 ++- 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 8bee55bd7e..9503c67d81 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -105,7 +105,7 @@ h1, h2, h3, h4, h5, h6 { } -h1, h2, h3, h4, h5 { +h1, h2, h3, h4, h5, body { font-family: 'Gudea', sans-serif; } diff --git a/app/assets/stylesheets/homepages.scss b/app/assets/stylesheets/homepages.scss index 531b18914c..ba78c4146c 100644 --- a/app/assets/stylesheets/homepages.scss +++ b/app/assets/stylesheets/homepages.scss @@ -34,4 +34,8 @@ hr { .top-ten-creator { color: slategrey; + } + + .flash.alert.alert { + } \ No newline at end of file diff --git a/app/assets/stylesheets/works.scss b/app/assets/stylesheets/works.scss index de6e677177..b0fe84779f 100644 --- a/app/assets/stylesheets/works.scss +++ b/app/assets/stylesheets/works.scss @@ -6,4 +6,4 @@ } .work-votes-header { color: black; -} \ No newline at end of file +} \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb index be0d77815c..1065626b99 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,4 +1,9 @@ class User < ApplicationRecord validates :username, presence: true has_many :votes + + def self.user(user_id) + user = User.find_by(id: user_id) + return user + end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 6278037bb1..fcd6260dd8 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -25,7 +25,8 @@
  • <%=link_to "Log In", login_path, class: "btn btn-primary"%>
  • <% else %> -
  • <%=link_to "Log Out", logout_path, method: :post, class: "btn btn-primary"%>
  • +
  • <%=link_to "Logged in as #{User.user(session[:user_id]).username}", "/", method: :get, class: "btn btn-primary"%>
  • +
  • <%=link_to "Log Out", logout_path, method: :post, class: "btn btn-primary"%>
  • <%end%> From e3093977538361fa7e2c6fef168cbdc6e25115c7 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Fri, 26 Apr 2019 11:05:04 -0700 Subject: [PATCH 40/59] action index in user controller and routes index, show --- app/controllers/users_controller.rb | 4 ++++ config/routes.rb | 2 ++ 2 files changed, 6 insertions(+) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 6c7c8da9f7..14c2c02d36 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,4 +1,8 @@ class UsersController < ApplicationController + def index + @users = User.all + end + def login_form @user = User.new end diff --git a/config/routes.rb b/config/routes.rb index f687edc8b4..09f298e014 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,6 +8,8 @@ post "/logout", to: "users#logout", as: "logout" get "/users/current", to: "users#current", as: "current_user" + resources :user, only: [:index, :show] + resources :works do resources :votes, only: [:create] end From 3212d4ce6264799c71f645e415d33428947f2715 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Fri, 26 Apr 2019 11:25:55 -0700 Subject: [PATCH 41/59] index html erb file for users page and vote count method in user --- app/models/user.rb | 4 ++++ app/models/work.rb | 2 -- app/views/layouts/application.html.erb | 2 +- app/views/users/index.html.erb | 18 ++++++++++++++++++ config/routes.rb | 4 ++-- 5 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 app/views/users/index.html.erb diff --git a/app/models/user.rb b/app/models/user.rb index 1065626b99..cb35d37390 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -6,4 +6,8 @@ def self.user(user_id) user = User.find_by(id: user_id) return user end + + def self.vote_count(user) + user.votes.count + end end diff --git a/app/models/work.rb b/app/models/work.rb index dd962e2283..ae814dab0f 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -12,7 +12,6 @@ def self.category return ["album", "book", "movie"] end - def self.media_votes(category) works = Work.where(category: category).left_joins(:votes).select("works.*, COUNT(votes.id) as vote_count").group(:id).order("COUNT(votes.id) DESC").limit(10) return works @@ -25,5 +24,4 @@ def self.top_ten_media_votes(category) def self.media_vote_count(work) return work.votes.count end - end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index fcd6260dd8..10af7705f4 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -18,7 +18,7 @@ - +
    <% if !session[:user_id]%> diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb new file mode 100644 index 0000000000..bee077d184 --- /dev/null +++ b/app/views/users/index.html.erb @@ -0,0 +1,18 @@ +

    List of Users

    +
    + + + + + + + +<%@users.each do |user|%> + + + + +<%end%> + +
    UsernameVotesJoined
    <%=link_to "#{user.username}", user_path(user.id)%><%=User.vote_count(user)%><%=user.created_at.to_date.to_formatted_s(:rfc822)%>
    +<%=link_to "Back to media list", works_path, class: "btn btn-secondary"%> diff --git a/config/routes.rb b/config/routes.rb index 09f298e014..d24eeb7f3d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,8 +8,8 @@ post "/logout", to: "users#logout", as: "logout" get "/users/current", to: "users#current", as: "current_user" - resources :user, only: [:index, :show] - + resources :users, only: [:index, :show] + resources :works do resources :votes, only: [:create] end From 95b89aadf4a2bfd551b2077686043fc1467d0c1f Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Fri, 26 Apr 2019 13:35:54 -0700 Subject: [PATCH 42/59] created show page for a user --- app/controllers/users_controller.rb | 4 ++++ app/models/user.rb | 2 ++ app/views/users/show.html.erb | 25 +++++++++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 app/views/users/show.html.erb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 14c2c02d36..9c9723cbe8 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -3,6 +3,10 @@ def index @users = User.all end + def show + @user = User.find_by(id: params[:id]) + end + def login_form @user = User.new end diff --git a/app/models/user.rb b/app/models/user.rb index cb35d37390..ccec9c1b6d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,6 +1,7 @@ class User < ApplicationRecord validates :username, presence: true has_many :votes + has_many :works, through: :votes def self.user(user_id) user = User.find_by(id: user_id) @@ -10,4 +11,5 @@ def self.user(user_id) def self.vote_count(user) user.votes.count end + end diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb new file mode 100644 index 0000000000..b462f1538e --- /dev/null +++ b/app/views/users/show.html.erb @@ -0,0 +1,25 @@ +

    User summary: <%=link_to "#{@user.username}", user_path(@user.id)%>

    +

    Joined site: <%=@user.created_at.to_date.to_formatted_s(:rfc822)%> +

    +

    Votes

    + + + + + + + + + +<%@user.works.each do |work|%> + + + + + + +<%end%> + +
    Media TitleCreated byPublishedCategoryVoted On
    <%=link_to "#{work.title}", work_path(work.id)%><%=work.creator%><%=work.publication_year%><%=work.category.capitalize%> +<%=Vote.vote(@user,work).created_at.to_date.to_formatted_s(:rfc822)%>
    +
    \ No newline at end of file From 3f298d47ea07df9b6b8c850f5bc69d86cb7b5611 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Fri, 26 Apr 2019 14:29:45 -0700 Subject: [PATCH 43/59] test for votes controller create action --- app/controllers/votes_controller.rb | 1 - app/models/vote.rb | 2 + test/controllers/votes_controller_test.rb | 56 +++++++++++++++++++++-- test/fixtures/votes.yml | 4 +- 4 files changed, 58 insertions(+), 5 deletions(-) diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb index a95ab6c975..d838486e48 100644 --- a/app/controllers/votes_controller.rb +++ b/app/controllers/votes_controller.rb @@ -6,7 +6,6 @@ def create user_id = session[:user_id] @vote.user_id = user_id @vote.work_id = params[:work_id] - # if Vote.check_unique_work(user_id, work_id) begin @vote.save redirect_to works_path diff --git a/app/models/vote.rb b/app/models/vote.rb index 15614bdd58..191c629ade 100644 --- a/app/models/vote.rb +++ b/app/models/vote.rb @@ -15,4 +15,6 @@ def self.check_unique_work(user_id, work_id) def self.vote(user, work) return Vote.find_by(user_id: user.id, work_id: work.id) end + + end diff --git a/test/controllers/votes_controller_test.rb b/test/controllers/votes_controller_test.rb index cf4d03935f..ded9842920 100644 --- a/test/controllers/votes_controller_test.rb +++ b/test/controllers/votes_controller_test.rb @@ -1,7 +1,57 @@ require "test_helper" describe VotesController do - # it "must be a real test" do - # flunk "Need real tests" - # end + describe "create" do + let(:work) { + works(:custom1) + } + + let(:user) { + User.first + } + + let (:login) { + login_data = { + user: { + username: User.first.username, + }, + } + post login_path, params: login_data + } + + let (:vote) { + votes(:custom1) + } + + it "creates a new vote" do + login + + expect { + post work_votes_path(work.id) + }.must_change "Vote.count", 1 + must_redirect_to works_path + vote = Vote.last + expect(vote.user_id).must_equal session[:user_id] + expect(vote.work_id).must_equal work.id + end + + it "flashes an error if user is not logged in before voting" do + expect { + post work_votes_path(work.id) + }.wont_change "Vote.count" + + must_redirect_to work_path(work.id) + check_flash(:error) + end + + it "requires a vote to be unique (a user cannot upvote medium more than once)" do + login + work_id_dup = Work.last.id + expect { + post work_votes_path(work_id_dup) + }.wont_change "Vote.count" + must_redirect_to work_path(work_id_dup) + check_flash(:error) + end + end end diff --git a/test/fixtures/votes.yml b/test/fixtures/votes.yml index fe669a75af..d1f618ae71 100644 --- a/test/fixtures/votes.yml +++ b/test/fixtures/votes.yml @@ -8,4 +8,6 @@ two: user: two work: two - +custom1: + user: User.first + work: Work.first From 688e777c3c5c1f77d4227ddcc1645ed1baa72cb7 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Fri, 26 Apr 2019 14:52:59 -0700 Subject: [PATCH 44/59] votes model tests --- app/models/vote.rb | 14 +------------- app/views/users/show.html.erb | 2 +- test/fixtures/votes.yml | 4 ++++ test/models/vote_test.rb | 21 +++++++++++++++++++-- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/app/models/vote.rb b/app/models/vote.rb index 191c629ade..f410d5248e 100644 --- a/app/models/vote.rb +++ b/app/models/vote.rb @@ -2,19 +2,7 @@ class Vote < ApplicationRecord belongs_to :user belongs_to :work - def self.check_unique_work(user_id, work_id) - user = User.find(user_id) - vote = Vote.find_by(user: user_id) - if vote.work_id == work_id - return false - else - return true - end - end - def self.vote(user, work) - return Vote.find_by(user_id: user.id, work_id: work.id) + return Vote.find_by(user_id: user, work_id: work) end - - end diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index b462f1538e..c6dc5d5903 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -17,7 +17,7 @@ <%=work.creator%> <%=work.publication_year%> <%=work.category.capitalize%> -<%=Vote.vote(@user,work).created_at.to_date.to_formatted_s(:rfc822)%> +<%=Vote.vote(@user.id,work.id).created_at.to_date.to_formatted_s(:rfc822)%> <%end%> diff --git a/test/fixtures/votes.yml b/test/fixtures/votes.yml index d1f618ae71..c1dd7382c7 100644 --- a/test/fixtures/votes.yml +++ b/test/fixtures/votes.yml @@ -11,3 +11,7 @@ two: custom1: user: User.first work: Work.first + +custom2: + user: custom1 + work: custom1 diff --git a/test/models/vote_test.rb b/test/models/vote_test.rb index fc15947bd3..868a486e41 100644 --- a/test/models/vote_test.rb +++ b/test/models/vote_test.rb @@ -3,7 +3,24 @@ describe Vote do let(:vote) { Vote.new } - it "must be valid" do - value(vote).must_be :valid? + describe "relations" do + it "has a user and work" do + vote = votes(:custom2) + vote.user.must_equal users(:custom1) + vote.work.must_equal works(:custom1) + end + end + + describe "vote method" do + it "returns the correct vote given a user and work" do + work = works(:custom1) + user = users(:custom1) + expect (vote.valid?).must_equal false #is this false because I don't have a new action or because it doesn't have a user id or workid + expect(Vote.vote(user, work)).must_equal votes(:custom2) + end + + it "returns nil if invalid user or work given" do + expect(Vote.vote(1, 2)).must_be_nil + end end end From 442ffdf360c3a35c2983fa4e9e854de72ef0050a Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Fri, 26 Apr 2019 15:14:32 -0700 Subject: [PATCH 45/59] test on returning 200 OK for logged in user --- app/controllers/users_controller.rb | 2 ++ test/controllers/users_controller_test.rb | 44 +++++++++++------------ 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 9c9723cbe8..635d73c0ff 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -38,6 +38,8 @@ def current def logout session[:user_id] = nil + flash[:status] = :success + flash[:message] = "Successfully logged out" redirect_to root_path end end diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index afcfa46d6a..3d5285b137 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -1,34 +1,30 @@ require "test_helper" describe UsersController do - describe "current do" - it "gets the login path" do - get login_path - - must_respond_with :success - end - - it "returns 200 OK for a logged-in user" do - user = User.first - login_data = { - user: { - username: user.username + describe "current" do + it "gets the login path" do + get login_path + + must_respond_with :success + end + + it "returns 200 OK for a logged-in user" do + user = users(:custom1) + login_data = { + user: { + username: user.username, + }, } - } - post login_path, params: login_data + post login_path, params: login_data - expect(session[:user_id]).must_equal user.id + must_respond_with :redirect - get current_user_path + expect(session[:user_id]).must_equal user.id - must_respond_with :success - # it "successfully logs a user in" do - # username = "cyndi" - # user = User.create(username: username) + get current_user_path - # expect { - # post login_path(user) - # }.must_change "User.count", +1 - # end + must_respond_with :redirect + end + end end From 1b70ced66bdc3bf7b3ed3c923d6b2af90c968e15 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Fri, 26 Apr 2019 15:29:08 -0700 Subject: [PATCH 46/59] Revert "test on returning 200 OK for logged in user" This reverts commit 442ffdf360c3a35c2983fa4e9e854de72ef0050a. --- app/controllers/users_controller.rb | 2 -- test/controllers/users_controller_test.rb | 44 ++++++++++++----------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 635d73c0ff..9c9723cbe8 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -38,8 +38,6 @@ def current def logout session[:user_id] = nil - flash[:status] = :success - flash[:message] = "Successfully logged out" redirect_to root_path end end diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index 3d5285b137..afcfa46d6a 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -1,30 +1,34 @@ require "test_helper" describe UsersController do - describe "current" do - it "gets the login path" do - get login_path - - must_respond_with :success - end - - it "returns 200 OK for a logged-in user" do - user = users(:custom1) - login_data = { - user: { - username: user.username, - }, + describe "current do" + it "gets the login path" do + get login_path + + must_respond_with :success + end + + it "returns 200 OK for a logged-in user" do + user = User.first + login_data = { + user: { + username: user.username } + } - post login_path, params: login_data + post login_path, params: login_data - must_respond_with :redirect + expect(session[:user_id]).must_equal user.id - expect(session[:user_id]).must_equal user.id + get current_user_path - get current_user_path + must_respond_with :success + # it "successfully logs a user in" do + # username = "cyndi" + # user = User.create(username: username) - must_respond_with :redirect - end - end + # expect { + # post login_path(user) + # }.must_change "User.count", +1 + # end end From d56d9a2c018432f26077bc5f60dadb0604f6b96b Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Fri, 26 Apr 2019 15:57:36 -0700 Subject: [PATCH 47/59] index and show tests for users controller --- app/controllers/users_controller.rb | 6 +++ app/views/layouts/application.html.erb | 2 +- app/views/users/current.html.erb | 26 +++++++++- app/views/works/show.html.erb | 2 +- test/controllers/users_controller_test.rb | 62 ++++++++++++++--------- 5 files changed, 72 insertions(+), 26 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 9c9723cbe8..be0327e817 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -5,6 +5,12 @@ def index def show @user = User.find_by(id: params[:id]) + unless @user + flash.now[:status] = :error + flash.now[:message] = "Could not find that user." + redirect_to users_path + return + end end def login_form diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 10af7705f4..5cb98ccf17 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -25,7 +25,7 @@
  • <%=link_to "Log In", login_path, class: "btn btn-primary"%>
  • <% else %> -
  • <%=link_to "Logged in as #{User.user(session[:user_id]).username}", "/", method: :get, class: "btn btn-primary"%>
  • +
  • <%=link_to "Logged in as #{User.user(session[:user_id]).username}", user_path(session[:user_id]), method: :get, class: "btn btn-primary"%>
  • <%=link_to "Log Out", logout_path, method: :post, class: "btn btn-primary"%>
  • <%end%> diff --git a/app/views/users/current.html.erb b/app/views/users/current.html.erb index 3e7bf37077..e3d3ddc997 100644 --- a/app/views/users/current.html.erb +++ b/app/views/users/current.html.erb @@ -1 +1,25 @@ -

    You are logged in as user <%= @user.username %>

    +

    User summary: <%=link_to "#{@user.username}", current_user_path%>

    +

    Joined site: <%=@user.created_at.to_date.to_formatted_s(:rfc822)%> +

    +

    Votes

    + + + + + + + + + +<%@user.works.each do |work|%> + + + + + + +<%end%> + +
    Media TitleCreated byPublishedCategoryVoted On
    <%=link_to "#{work.title}", work_path(work.id)%><%=work.creator%><%=work.publication_year%><%=work.category.capitalize%> +<%=Vote.vote(@user.id,work.id).created_at.to_date.to_formatted_s(:rfc822)%>
    +
    \ No newline at end of file diff --git a/app/views/works/show.html.erb b/app/views/works/show.html.erb index 4c52767c67..dd277b0052 100644 --- a/app/views/works/show.html.erb +++ b/app/views/works/show.html.erb @@ -18,7 +18,7 @@ <%@work.users.each do |user|%> -<%=link_to "#{user.username}"%> +<%=link_to "#{user.username}", user_path(user.id)%> <%=Vote.vote(user,@work).created_at.to_date.to_formatted_s(:rfc822)%> <%end%> diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index afcfa46d6a..abff7a0d5b 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -1,34 +1,50 @@ require "test_helper" describe UsersController do - describe "current do" - it "gets the login path" do - get login_path + describe "current" do + it "gets the login path" do + get login_path + + must_respond_with :success + end + + it "returns 200 OK for a logged-in user" do + user = users(:custom1) + login_data = { + user: { + username: user.username, + }, + } - must_respond_with :success - end + post login_path, params: login_data - it "returns 200 OK for a logged-in user" do - user = User.first - login_data = { - user: { - username: user.username - } - } + expect(session[:user_id]).must_equal user.id - post login_path, params: login_data + get current_user_path - expect(session[:user_id]).must_equal user.id + must_respond_with :redirect + end + end - get current_user_path + describe "index" do + it "can get the index" do + get users_path + must_respond_with :success + end + end + + describe "show" do + it "can get the details page" do + user = users(:custom1) + expect(user.username).must_equal "cyndilopez6" + get user_path(user.id) + must_respond_with :success + end - must_respond_with :success - # it "successfully logs a user in" do - # username = "cyndi" - # user = User.create(username: username) + it "will redirect if given an invalid user id" do + get user_path(-1) - # expect { - # post login_path(user) - # }.must_change "User.count", +1 - # end + must_respond_with :redirect + end + end end From a8fe2f781ae58b978329b0270b4dff12ac710aac Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Sat, 27 Apr 2019 12:26:38 -0700 Subject: [PATCH 48/59] homepage controller tests --- test/controllers/homepages_controller_test.rb | 12 ++++++++++++ test/fixtures/users.yml | 5 +++++ test/fixtures/votes.yml | 17 +++++++++++++++++ test/fixtures/works.yml | 15 ++++++++++++++- 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/test/controllers/homepages_controller_test.rb b/test/controllers/homepages_controller_test.rb index 309b927912..2cebfbe285 100644 --- a/test/controllers/homepages_controller_test.rb +++ b/test/controllers/homepages_controller_test.rb @@ -1,5 +1,17 @@ require "test_helper" describe HomepagesController do + describe "spotlight" do + it "returns the work with the most votes" do + top_work = works(:monkey) + expect(Homepage.spotlight.title).must_equal top_work.title + expect(Homepage.spotlight.vote_count).must_equal 3 + end + it "returns the first work if two works are tied" do + votes(:custom5).destroy + expect(Homepage.spotlight.vote_count).must_equal 2 + expect(Homepage.spotlight.title).must_equal "12 Monkeys" + end + end end diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index 6e650cc989..73965b9be0 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -8,3 +8,8 @@ two: custom1: username: cyndilopez6 + +bert: + username: bert1996 + + diff --git a/test/fixtures/votes.yml b/test/fixtures/votes.yml index c1dd7382c7..0a946f47ae 100644 --- a/test/fixtures/votes.yml +++ b/test/fixtures/votes.yml @@ -15,3 +15,20 @@ custom1: custom2: user: custom1 work: custom1 + +custom3: + user: custom1 + work: monkey + +custom4: + user: bert + work: monkey + +custom5: + user: one + work: monkey + +custom6: + user: bert + work: custom1 + diff --git a/test/fixtures/works.yml b/test/fixtures/works.yml index 4bd7307cd1..f8c4252e7e 100644 --- a/test/fixtures/works.yml +++ b/test/fixtures/works.yml @@ -21,4 +21,17 @@ custom1: publication_year: 1813 description: "Emotional development of protagonist, Elizabeth Bennett" - \ No newline at end of file +movie: + category: "movie" + title: "Green Book" + creator: "Peter Farrelly" + publication_year: 2018 + description: "story of deep south" + +monkey: + category: movie + title: "12 Monkeys" + creator: "Terry Gilliam" + publication_year: 1995 + description: "American neo-noir science fiction film" + From ee18a4ad9fed20ac3f0cde4d6b82ff07b99d6240 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Sat, 27 Apr 2019 15:02:46 -0700 Subject: [PATCH 49/59] work model tests for methods media_votes and media_vote_count --- app/controllers/works_controller.rb | 39 ++++------------------ test/controllers/works_controller_test.rb | 3 -- test/fixtures/votes.yml | 3 ++ test/fixtures/works.yml | 9 +++++ test/models/work_test.rb | 40 ++++++++++++++++++++++- 5 files changed, 57 insertions(+), 37 deletions(-) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 831a71d124..3dff40c765 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -1,6 +1,6 @@ class WorksController < ApplicationController + before_action :find_work, only: [:show, :edit, :update] - before_action :find_work, only: [:show, :edit, :update] def index @works = Work.all end @@ -23,34 +23,7 @@ def create end end -# def show - # @work = Work.find_by(id: params[:id]) - - # unless @work - # flash.now[:status] = :error - # flash.now[:message] = "Could not find media with that id: #{params[:id]}" - # redirect_to works_path - # return - # end - - # @unrated_trip = @passenger.trips.find_by(rating: nil) - # @trip = Trip.new - # @trips = @passenger.trips -# end - -# def edit - # @work = Work.find_by(id: params[:id]) - # unless @work - # redirect_to works_path, flash: { error: "Could not find media with id: #{params[:id]}" } - # end -# end - def update - # @work = Work.find_by(id: params[:id]) - # unless @work - # head :not_found - # return - # end if @work.update(work_params) flash[:status] = :success flash[:message] = "Successfully updated media #{@work.id}" @@ -84,10 +57,10 @@ def work_params def find_work @work = Work.find_by(id: params[:id]) unless @work - flash.now[:status] = :error - flash.now[:message] = "Could not find media with that id: #{params[:id]}" - redirect_to works_path - return - end + flash.now[:status] = :error + flash.now[:message] = "Could not find media with that id: #{params[:id]}" + redirect_to works_path + return + end end end diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb index 5b4d212787..7c32f37ad0 100644 --- a/test/controllers/works_controller_test.rb +++ b/test/controllers/works_controller_test.rb @@ -81,9 +81,6 @@ } it "changes the data on the model" do work = Work.first - # work.assign_attributes(work_data[:work]) - # expect(work).must_be :valid? - # work.reload patch work_path(work), params: work_data diff --git a/test/fixtures/votes.yml b/test/fixtures/votes.yml index 0a946f47ae..3ad753a044 100644 --- a/test/fixtures/votes.yml +++ b/test/fixtures/votes.yml @@ -32,3 +32,6 @@ custom6: user: bert work: custom1 +custom7: + user: bert + work: avengers diff --git a/test/fixtures/works.yml b/test/fixtures/works.yml index f8c4252e7e..96e52fe4e7 100644 --- a/test/fixtures/works.yml +++ b/test/fixtures/works.yml @@ -35,3 +35,12 @@ monkey: publication_year: 1995 description: "American neo-noir science fiction film" +avengers: + category: movie + title: "Avengers Infinity War" + creator: "Anthony Russo" + publication_year: 2018 + description: "Iron Man, Thor, the Hulk and the rest of the Avengers unite to battle their most powerful enemy yet -- the evil Thanos" + + + diff --git a/test/models/work_test.rb b/test/models/work_test.rb index 5e30ebdb92..829ce3d7eb 100644 --- a/test/models/work_test.rb +++ b/test/models/work_test.rb @@ -2,7 +2,7 @@ describe Work do let(:work) { Work.new } - + let(:monkey) { works(:monkey) } describe "validations" do it "rejects validations with bad data" do work @@ -16,4 +16,42 @@ expect(work).must_be :valid? end end + + describe "relations" do + it "has votes" do + work = monkey + expect(work.votes).wont_be_nil + end + + it "has users through votes" do + work = monkey + expect(work.users).wont_be_nil + end + end + + describe "media_votes" do + it "returns a list of works in ascending order of vote counts" do + list_all_movies = Work.media_votes("movie") + expect(list_all_movies[0]).must_equal monkey + expect(list_all_movies[1]).must_equal works(:avengers) + expect(list_all_movies[2]).must_equal works(:movie) + end + + it "returns an empty array if category doesnt exist" do + list_all_movies = Work.media_votes("show") + expect(list_all_movies).must_equal [] + end + + it "returns an empty array if no works associated with that category" do + list_all_movies = Work.media_votes("album") + expect(list_all_movies).must_equal [] + end + end + + describe "media_vote_count" do + it "returns number of votes for a given work" do + work = monkey + expect(Work.media_vote_count(work)).must_equal 3 + end + end end From 88332ebc80124c8156de943f0b8a8080463c1c0f Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Sat, 27 Apr 2019 15:22:38 -0700 Subject: [PATCH 50/59] tests for top_ten_media_votes --- test/fixtures/works.yml | 54 ++++++++++++++++++++++++++++++++++++++++ test/models/work_test.rb | 14 ++++++++++- 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/test/fixtures/works.yml b/test/fixtures/works.yml index 96e52fe4e7..8408bf2d37 100644 --- a/test/fixtures/works.yml +++ b/test/fixtures/works.yml @@ -42,5 +42,59 @@ avengers: publication_year: 2018 description: "Iron Man, Thor, the Hulk and the rest of the Avengers unite to battle their most powerful enemy yet -- the evil Thanos" +random: + category: movie + title: "random" + creator: "random" + publication_year: 1 + description: "random" + + +random2: + category: movie + title: MyString + creator: MyString + publication_year: 1 + description: MyString + +random3: + category: movie + title: MyString + creator: MyString + publication_year: 1 + description: MyString + +random4: + category: movie + title: MyString + creator: MyString + publication_year: 1 + description: MyString +random5: + category: movie + title: MyString + creator: MyString + publication_year: 1 + description: MyString + +random6: + category: movie + title: MyString + creator: MyString + publication_year: 1 + description: MyString +random7: + category: movie + title: MyString + creator: MyString + publication_year: 1 + description: MyString + +random8: + category: movie + title: MyString + creator: MyString + publication_year: 1 + description: MyString \ No newline at end of file diff --git a/test/models/work_test.rb b/test/models/work_test.rb index 829ce3d7eb..fe963e9400 100644 --- a/test/models/work_test.rb +++ b/test/models/work_test.rb @@ -34,7 +34,7 @@ list_all_movies = Work.media_votes("movie") expect(list_all_movies[0]).must_equal monkey expect(list_all_movies[1]).must_equal works(:avengers) - expect(list_all_movies[2]).must_equal works(:movie) + expect(list_all_movies[2]).must_equal works(:random8) end it "returns an empty array if category doesnt exist" do @@ -48,6 +48,18 @@ end end + describe "#top_ten_media_votes" do + it "returns only ten media if there are ten or more media in that category" do + list_all_movies = Work.top_ten_media_votes("movie") + expect(list_all_movies.length).must_equal 10 + end + + it "return less than ten media if the total works for a given category is less than ten" do + list_all_movies = Work.top_ten_media_votes("book") + expect(list_all_movies.length).must_be :<, 10 + end + end + describe "media_vote_count" do it "returns number of votes for a given work" do work = monkey From a5945cc6b510316c442f1d42fec2a77527ffe3a4 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Sat, 27 Apr 2019 15:57:13 -0700 Subject: [PATCH 51/59] added vote_count and user method tests --- app/views/users/current.html.erb | 4 ++-- app/views/users/index.html.erb | 2 +- app/views/users/show.html.erb | 4 ++-- app/views/works/show.html.erb | 2 +- test/models/user_test.rb | 21 ++++++++++++++++++--- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/app/views/users/current.html.erb b/app/views/users/current.html.erb index e3d3ddc997..efd71c9120 100644 --- a/app/views/users/current.html.erb +++ b/app/views/users/current.html.erb @@ -1,5 +1,5 @@

    User summary: <%=link_to "#{@user.username}", current_user_path%>

    -

    Joined site: <%=@user.created_at.to_date.to_formatted_s(:rfc822)%> +

    Joined site: <%=@user.created_at.strftime("%b,%d,%Y")>

    Votes

    @@ -17,7 +17,7 @@ + <%end%> diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb index bee077d184..b95e5cf5b8 100644 --- a/app/views/users/index.html.erb +++ b/app/views/users/index.html.erb @@ -11,7 +11,7 @@ - + <%end%>
    <%=work.creator%> <%=work.publication_year%> <%=work.category.capitalize%> -<%=Vote.vote(@user.id,work.id).created_at.to_date.to_formatted_s(:rfc822)%><%=Vote.vote(@user.id,work.id).created_at.strftime("%b,%d,%Y")%>
    <%=link_to "#{user.username}", user_path(user.id)%> <%=User.vote_count(user)%><%=user.created_at.to_date.to_formatted_s(:rfc822)%><%=user.created_at.strftime("%b %d, %Y")%>
    diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index c6dc5d5903..bb96ade666 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -1,5 +1,5 @@

    User summary: <%=link_to "#{@user.username}", user_path(@user.id)%>

    -

    Joined site: <%=@user.created_at.to_date.to_formatted_s(:rfc822)%> +

    Joined site: <%=@user.created_at.strftime("%b %d, %Y")%>

    Votes

    @@ -17,7 +17,7 @@ + <%end%> diff --git a/app/views/works/show.html.erb b/app/views/works/show.html.erb index dd277b0052..32e2deeda0 100644 --- a/app/views/works/show.html.erb +++ b/app/views/works/show.html.erb @@ -19,7 +19,7 @@ <%@work.users.each do |user|%> - <%end%>
    <%=work.creator%> <%=work.publication_year%> <%=work.category.capitalize%> -<%=Vote.vote(@user.id,work.id).created_at.to_date.to_formatted_s(:rfc822)%><%=Vote.vote(@user.id,work.id).created_at.strftime("%b %d, %Y")%>
    <%=link_to "#{user.username}", user_path(user.id)%><%=Vote.vote(user,@work).created_at.to_date.to_formatted_s(:rfc822)%> +<%=Vote.vote(user,@work).created_at.strftime("%b %d, %Y")%>
    diff --git a/test/models/user_test.rb b/test/models/user_test.rb index 991f009642..4efd0ed3c5 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -2,7 +2,7 @@ describe User do let(:user) { User.new } - + let (:user_valid) { users(:custom1) } describe "validations" do it "rejects validations with bad data" do expect(user.valid?).must_equal false @@ -10,8 +10,23 @@ end it "passes validations with good data" do - user = users(:custom1) - expect(user).must_be :valid? + expect(user_valid).must_be :valid? + end + end + + describe "#user" do + it "finds the user associated with a user id" do + expect(User.user(user_valid.id)).must_equal user_valid + end + + it "returns nil if user doesnt exist" do + expect(User.user(-1)).must_be_nil + end + end + + describe "#vote_count" do + it "returns the number of votes taken by a given user" do + User.vote_count(user_valid).must_equal 2 end end end From 5892e8e48850366927e15ed3fb8452bf19938674 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Sat, 27 Apr 2019 18:52:20 -0700 Subject: [PATCH 52/59] tests for user model and changed how errors and warnings are displayed on the website to the user --- app/assets/stylesheets/application.scss | 11 ++++++++++- app/controllers/users_controller.rb | 9 ++++++--- app/controllers/votes_controller.rb | 18 +++++++++++------- app/controllers/works_controller.rb | 4 ++-- app/views/layouts/application.html.erb | 10 ++++++++++ app/views/users/login_form.html.erb | 10 ++++++---- app/views/works/_form.html.erb | 12 +++++++++--- app/views/works/edit.html.erb | 3 +-- app/views/works/new.html.erb | 3 +-- test/controllers/votes_controller_test.rb | 10 +++++----- test/controllers/works_controller_test.rb | 10 +++++----- 11 files changed, 66 insertions(+), 34 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 9503c67d81..455867a926 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -129,4 +129,13 @@ main { .btn-danger:hover { border-color: #bd2130; -} \ No newline at end of file +} + +.use-list { + display: block; + list-style-type: disc; + margin-top: 1em; + margin-bottom: 1em; + margin-left: 0; + margin-right: 0; + padding-left: 40px;} \ No newline at end of file diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index be0327e817..18097f4191 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -22,11 +22,11 @@ def login @user = User.find_by(username: username) if @user flash[:status] = :success - flash[:message] = "Succesfully logged in as returning user #{username}" + flash[:message] = "Succesfully logged in as existing user #{username}" else @user = User.create(username: username) flash[:status] = :success - flash[:message] = "Succesfully logged in as new user #{username}" + flash[:message] = "Succesfully created new user #{username} with ID #{@user.id}" end session[:user_id] = @user.id @@ -36,7 +36,7 @@ def login def current @user = User.find(session[:user_id]) unless @user - flash[:status] = :error + flash[:status] = :warning flash[:message] = "You must be logged in to see this page." end redirect_to root_path @@ -44,6 +44,9 @@ def current def logout session[:user_id] = nil + flash[:status] = :success + flash[:message] = "Successfully logged out" + redirect_to root_path end end diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb index d838486e48..66934c8dcd 100644 --- a/app/controllers/votes_controller.rb +++ b/app/controllers/votes_controller.rb @@ -8,16 +8,20 @@ def create @vote.work_id = params[:work_id] begin @vote.save - redirect_to works_path + redirect_back(fallback_location: root_path) + flash[:status] = :success + flash[:message] = "Successfully upvoted!" rescue ActiveRecord::RecordNotUnique - flash[:status] = :error - flash[:message] = "user: has already voted for this work" - redirect_to work_path(work_id) + flash[:status] = :warning + flash[:message] = "A problem occurred: Could not upvote" + flash[:notice] = "No vote" + + redirect_back(fallback_location: root_path) end else - flash[:status] = :error - flash[:message] = "A problem occurred: You must log in to do that." - redirect_to work_path(work_id) + flash[:status] = :warning + flash[:message] = "A problem occurred: You must log in to do that" + redirect_back(fallback_location: root_path) end end diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 3dff40c765..f26d2939d8 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -17,8 +17,8 @@ def create flash[:message] = "Successfully created media #{@work.id}" redirect_to works_path else - flash[:status] = :error - flash[:message] = "Could not find media with that id: #{params[:id]}" + # flash[:status] = :error + # flash[:message] = "Could not find media with that id: #{params[:id]}" render :new end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 5cb98ccf17..08a85048e6 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -30,12 +30,22 @@ <%end%> +
    + + <% if flash[:status]%> <% alert_type = flash[:status] == :error ? :danger : flash[:status] %>
    + <%= flash[:message] %> +
      + <% if flash[:notice]== "No vote"%> +
    • user: has already voted for this work
    • + <%end%> +
    + <%end%> <%= yield %>
    diff --git a/app/views/users/login_form.html.erb b/app/views/users/login_form.html.erb index 448f30413d..60998cd576 100644 --- a/app/views/users/login_form.html.erb +++ b/app/views/users/login_form.html.erb @@ -1,6 +1,8 @@ +

    Login

    <%= form_with model: @user, url: login_path do |f| %> +
    <%= f.label :username %> - <%= f.text_field :username %> - - <%= f.submit "Log In" %> -<% end %> \ No newline at end of file + <%= f.text_field :username, class: "form-control" %> +
    + <%= f.submit "Log In", class: "btn btn-primary" %> +<% end %> diff --git a/app/views/works/_form.html.erb b/app/views/works/_form.html.erb index 48949d74e3..40373ec168 100644 --- a/app/views/works/_form.html.erb +++ b/app/views/works/_form.html.erb @@ -1,8 +1,10 @@ -
    + <% if @work.errors.messages.any? %> +
    +
    - There are errors with your submission -
      + A problem occurred: Could not create <%=@work.category%> +
        <% @work.errors.messages.each do |col, prob| %> <% prob.each do |problem|%>
      • <%= col%>: <%= problem%>
      • @@ -11,7 +13,11 @@
    <% end %> +
    + +

    <%=heading%>

    +
    <%= form_with model: @work do |f| %>
    <%=f.label :category, "Category"%> diff --git a/app/views/works/edit.html.erb b/app/views/works/edit.html.erb index d084aba45d..f6dead6934 100644 --- a/app/views/works/edit.html.erb +++ b/app/views/works/edit.html.erb @@ -1,2 +1 @@ -

    Edit This <%=@work.category.capitalize%>

    -<%= render partial: 'form', locals: {button_text: "Update Work"} %> +<%= render partial: 'form', locals: {heading: "Edit this #{@work.category.capitalize}", button_text: "Update Work"} %> diff --git a/app/views/works/new.html.erb b/app/views/works/new.html.erb index 8f8c360e8c..84005bb766 100644 --- a/app/views/works/new.html.erb +++ b/app/views/works/new.html.erb @@ -1,2 +1 @@ -

    Add a new work

    -<%= render partial: 'form', locals: {button_text: "Create Work"} %> +<%= render partial: 'form', locals: {heading: "Add a new work", button_text: "Create Work"} %> diff --git a/test/controllers/votes_controller_test.rb b/test/controllers/votes_controller_test.rb index ded9842920..c7b7f50825 100644 --- a/test/controllers/votes_controller_test.rb +++ b/test/controllers/votes_controller_test.rb @@ -29,7 +29,7 @@ expect { post work_votes_path(work.id) }.must_change "Vote.count", 1 - must_redirect_to works_path + must_redirect_to root_path vote = Vote.last expect(vote.user_id).must_equal session[:user_id] expect(vote.work_id).must_equal work.id @@ -40,8 +40,8 @@ post work_votes_path(work.id) }.wont_change "Vote.count" - must_redirect_to work_path(work.id) - check_flash(:error) + must_redirect_to root_path + check_flash(:warning) end it "requires a vote to be unique (a user cannot upvote medium more than once)" do @@ -50,8 +50,8 @@ expect { post work_votes_path(work_id_dup) }.wont_change "Vote.count" - must_redirect_to work_path(work_id_dup) - check_flash(:error) + must_redirect_to root_path + check_flash(:warning) end end end diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb index 7c32f37ad0..d4d18d12e1 100644 --- a/test/controllers/works_controller_test.rb +++ b/test/controllers/works_controller_test.rb @@ -93,13 +93,13 @@ expect(work.publication_year).must_equal(work_data[:work][:publication_year]) end - it "responds with NOT FOUND for a fake book" do - patch work_path(-1), params: work_data - must_respond_with :not_found - end + # it "responds with NOT FOUND for an invalid work" do + + # patch work_path(-100), params: work_data + # must_respond_with :not_found + # end it "responds with BAD REQUEST for bad data" do - skip work = Work.first work_data[:work][:publication_year] = "" From a810513e668c7e0d6a3db45698bb19144c3e854b Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Sun, 28 Apr 2019 16:50:36 -0700 Subject: [PATCH 53/59] styling changes and added test to works controller to redirect for an invalid work and in the update action, and to return a not found if the work doesn't exist in the destroy action --- app/assets/stylesheets/application.scss | 25 ++++++++++---------- app/views/layouts/application.html.erb | 17 +++++++++----- test/controllers/works_controller_test.rb | 28 +++++++++++++++-------- 3 files changed, 41 insertions(+), 29 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 455867a926..c97fc82c17 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -19,9 +19,6 @@ /* Impoty Gudea font from google */ @import url('https://fonts.googleapis.com/css?family=Gudea:400,700'); -// .content { -// grid-template-rows: 150px 1; -// } .overall-header { max-width: 100%; @@ -29,14 +26,11 @@ margin-bottom: 0.5rem; padding: 2rem 1rem 0.5rem 1rem; display: block; - // box-sizing: border-box; } .overall-header h1 { display: block; font-weight: bold; - // line-height: 1.2; - // color: inherit; margin-block-start: 0.67em; margin-block-end: 0.67em; margin-inline-start: 0px; @@ -65,7 +59,6 @@ nav { .overall-header .nav-link { color: #00796b; display: inline-block; - // padding: 0.5rem 1rem; } @@ -74,10 +67,8 @@ ul { flex-wrap: wrap; flex-direction: row; list-style-type: none; - // margin-block-start: 0.67em; margin-block-end: 0.67em; - // margin-inline-start: 0px; - // margin-inline-end: 0px; + } .btn-primary { background-color: #26A69A; @@ -110,8 +101,6 @@ h1, h2, h3, h4, h5, body { } - - p { margin-top: 0; margin-bottom: 1rem; @@ -122,6 +111,7 @@ main { display: block; } + .btn:hover { background-color: #00796B; color: white; @@ -138,4 +128,13 @@ main { margin-bottom: 1em; margin-left: 0; margin-right: 0; - padding-left: 40px;} \ No newline at end of file + padding-left: 40px; +} + +.alert { + margin: 0; +} + +.flash-container { + margin: 2rem 0 1rem 0; +} \ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 08a85048e6..5cf715a7ee 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -31,21 +31,26 @@ -
    - +
    <% if flash[:status]%> <% alert_type = flash[:status] == :error ? :danger : flash[:status] %>
    - - <%= flash[:message] %> -
      + <%= flash[:message] %> <% if flash[:notice]== "No vote"%> +
        +
      • user: has already voted for this work
      • +
      + <%end%> -
    <%end%> +
    +
    + + + <%= yield %>
    diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb index d4d18d12e1..f4ea2df025 100644 --- a/test/controllers/works_controller_test.rb +++ b/test/controllers/works_controller_test.rb @@ -46,12 +46,11 @@ expect { post works_path, params: work_data }.must_change "Work.count", +1 + check_flash must_respond_with :redirect must_redirect_to works_path - check_flash - work = Work.last expect(work.title).must_equal work_data[:work][:title] expect(work.publication_year).must_equal work_data[:work][:publication_year] @@ -93,11 +92,11 @@ expect(work.publication_year).must_equal(work_data[:work][:publication_year]) end - # it "responds with NOT FOUND for an invalid work" do - - # patch work_path(-100), params: work_data - # must_respond_with :not_found - # end + it "responds with redirect for an invalid work" do + patch work_path(-100) + check_flash(:error) + must_redirect_to works_path + end it "responds with BAD REQUEST for bad data" do work = Work.first @@ -125,12 +124,21 @@ must_redirect_to works_path check_flash - # check_flash(:error) after_delete_work = Work.find_by(id: work_to_delete.id) expect(after_delete_work).must_be_nil end + + it "returns a 404 if the work does not exist" do + work_id = -1 + + expect(Work.find_by(id: work_id)).must_be_nil + + expect { + delete work_path(work_id) + }.wont_change "Work.count" + + must_respond_with :not_found + end end end - -#validate things? use fixtures or let? From 6742c5743786b9a09266f95e0e75d74fc91afdf2 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Sun, 28 Apr 2019 16:57:50 -0700 Subject: [PATCH 54/59] deleted unnecessary comments --- app/assets/stylesheets/homepages.scss | 4 ---- app/controllers/works_controller.rb | 2 -- test/models/vote_test.rb | 2 +- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/app/assets/stylesheets/homepages.scss b/app/assets/stylesheets/homepages.scss index ba78c4146c..531b18914c 100644 --- a/app/assets/stylesheets/homepages.scss +++ b/app/assets/stylesheets/homepages.scss @@ -34,8 +34,4 @@ hr { .top-ten-creator { color: slategrey; - } - - .flash.alert.alert { - } \ No newline at end of file diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index f26d2939d8..5644a2a456 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -17,8 +17,6 @@ def create flash[:message] = "Successfully created media #{@work.id}" redirect_to works_path else - # flash[:status] = :error - # flash[:message] = "Could not find media with that id: #{params[:id]}" render :new end end diff --git a/test/models/vote_test.rb b/test/models/vote_test.rb index 868a486e41..9e00ae433b 100644 --- a/test/models/vote_test.rb +++ b/test/models/vote_test.rb @@ -15,7 +15,7 @@ it "returns the correct vote given a user and work" do work = works(:custom1) user = users(:custom1) - expect (vote.valid?).must_equal false #is this false because I don't have a new action or because it doesn't have a user id or workid + expect (vote.valid?).must_equal false expect(Vote.vote(user, work)).must_equal votes(:custom2) end From 8d009e46a788ee5ec0d842b0299dc1da759ab183 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Sun, 28 Apr 2019 17:09:09 -0700 Subject: [PATCH 55/59] wrapped direct sql code in Arel.sql() --- app/models/homepage.rb | 2 +- app/models/work.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/homepage.rb b/app/models/homepage.rb index f165585a2b..902c92ac1a 100644 --- a/app/models/homepage.rb +++ b/app/models/homepage.rb @@ -1,5 +1,5 @@ class Homepage < ApplicationRecord def self.spotlight - return Work.left_joins(:votes).select("works.*, COUNT(votes.id) as vote_count").group(:id).order("COUNT(votes.id) DESC").limit(1)[0] + return Work.left_joins(:votes).select(Arel.sql("works.*, COUNT(votes.id) as vote_count")).group(:id).order(Arel.sql("COUNT(votes.id) DESC")).limit(1)[0] end end diff --git a/app/models/work.rb b/app/models/work.rb index ae814dab0f..69d511db46 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -13,7 +13,7 @@ def self.category end def self.media_votes(category) - works = Work.where(category: category).left_joins(:votes).select("works.*, COUNT(votes.id) as vote_count").group(:id).order("COUNT(votes.id) DESC").limit(10) + works = Work.where(category: category).left_joins(:votes).select(Arel.sql("works.*, COUNT(votes.id) as vote_count")).group(:id).order(Arel.sql("COUNT(votes.id) DESC")).limit(10) return works end From 12870b453d45f05ae6e46c5f8dad9000845a6133 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Sun, 28 Apr 2019 17:16:05 -0700 Subject: [PATCH 56/59] added jquery sprocket injection --- app/assets/javascripts/application.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index b0ef35b723..b0309760cb 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -17,3 +17,4 @@ //= require activestorage //= require turbolinks //= require_tree . +//= require jquery3 From f3726cfaf6f1f0365d95e2c1f5ce0444e6002377 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Sun, 28 Apr 2019 17:25:20 -0700 Subject: [PATCH 57/59] tbody and table were ending before the correct end statement --- app/views/works/index.html.erb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb index bf2a83c38b..c81597339f 100644 --- a/app/views/works/index.html.erb +++ b/app/views/works/index.html.erb @@ -27,10 +27,11 @@ <% end %> + +<%end%> <%end%> -<%end%> <%=link_to "View top media", "/", class: "btn btn-secondary"%> <%=link_to "Add a new work", new_work_path, class: "btn btn-primary"%> From 91a09605b95bcf0618748162e672a00b4b28242c Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Sun, 28 Apr 2019 17:40:23 -0700 Subject: [PATCH 58/59] changed redirect to --- app/controllers/votes_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb index 66934c8dcd..c4e6babc11 100644 --- a/app/controllers/votes_controller.rb +++ b/app/controllers/votes_controller.rb @@ -8,7 +8,7 @@ def create @vote.work_id = params[:work_id] begin @vote.save - redirect_back(fallback_location: root_path) + redirect_to work_path(work_id) flash[:status] = :success flash[:message] = "Successfully upvoted!" rescue ActiveRecord::RecordNotUnique From 1c6b4775efddde0a76f72ea3d25b324e14c0e572 Mon Sep 17 00:00:00 2001 From: Cyndi Lopez Date: Sun, 28 Apr 2019 17:49:45 -0700 Subject: [PATCH 59/59] requirements javasscript sprocket --- app/assets/javascripts/application.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index b0309760cb..49fdcff32f 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -8,13 +8,13 @@ // compiled file. JavaScript code in this file should be added after the last require_* statement. // // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details -// about supported directives. //= require jquery3 - //= require popper - //= require bootstrap-sprockets +// about supported directives. // +//= require jquery3 +//= require popper +//= require bootstrap-sprockets // //= require rails-ujs //= require activestorage //= require turbolinks //= require_tree . -//= require jquery3