From ea1080edbce23b79b474b5919eabf992434dbecd Mon Sep 17 00:00:00 2001
From: Lynn Trickey
Date: Tue, 28 Mar 2017 15:03:09 -0700
Subject: [PATCH 01/15] Created Rails App and answered thinking questions
---
.gitignore | 21 +++++
Gemfile | 53 ++++++++++++
README.md | 20 ++++-
Rakefile | 6 ++
app/assets/config/manifest.js | 3 +
app/assets/images/.keep | 0
app/assets/javascripts/application.js | 16 ++++
app/assets/javascripts/cable.js | 13 +++
app/assets/javascripts/channels/.keep | 0
app/assets/stylesheets/application.css | 15 ++++
app/channels/application_cable/channel.rb | 4 +
app/channels/application_cable/connection.rb | 4 +
app/controllers/application_controller.rb | 3 +
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 | 14 +++
app/views/layouts/mailer.html.erb | 13 +++
app/views/layouts/mailer.text.erb | 1 +
bin/bundle | 3 +
bin/rails | 4 +
bin/rake | 4 +
bin/setup | 34 ++++++++
bin/update | 29 +++++++
config.ru | 5 ++
config/application.rb | 15 ++++
config/boot.rb | 3 +
config/cable.yml | 9 ++
config/database.yml | 25 ++++++
config/environment.rb | 5 ++
config/environments/development.rb | 54 ++++++++++++
config/environments/production.rb | 86 +++++++++++++++++++
config/environments/test.rb | 42 +++++++++
.../application_controller_renderer.rb | 6 ++
config/initializers/assets.rb | 11 +++
config/initializers/backtrace_silencers.rb | 7 ++
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/new_framework_defaults.rb | 24 ++++++
config/initializers/session_store.rb | 3 +
config/initializers/wrap_parameters.rb | 14 +++
config/locales/en.yml | 23 +++++
config/puma.rb | 47 ++++++++++
config/routes.rb | 3 +
config/secrets.yml | 22 +++++
config/spring.rb | 6 ++
db/seeds.rb | 7 ++
lib/assets/.keep | 0
lib/tasks/.keep | 0
log/.keep | 0
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 | 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/test_helper.rb | 10 +++
tmp/.keep | 0
vendor/assets/javascripts/.keep | 0
vendor/assets/stylesheets/.keep | 0
73 files changed, 930 insertions(+), 2 deletions(-)
create mode 100644 .gitignore
create mode 100644 Gemfile
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.css
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/update
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/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/application_controller_renderer.rb
create mode 100644 config/initializers/assets.rb
create mode 100644 config/initializers/backtrace_silencers.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/new_framework_defaults.rb
create mode 100644 config/initializers/session_store.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/secrets.yml
create mode 100644 config/spring.rb
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 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 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/test_helper.rb
create mode 100644 tmp/.keep
create mode 100644 vendor/assets/javascripts/.keep
create mode 100644 vendor/assets/stylesheets/.keep
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..bab620d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,21 @@
+# 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 the default SQLite database.
+/db/*.sqlite3
+/db/*.sqlite3-journal
+
+# Ignore all logfiles and tempfiles.
+/log/*
+/tmp/*
+!/log/.keep
+!/tmp/.keep
+
+# Ignore Byebug command history file.
+.byebug_history
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..b5fbf94
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,53 @@
+source 'https://rubygems.org'
+
+git_source(:github) do |repo_name|
+ repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
+ "https://github.com/#{repo_name}.git"
+end
+
+
+# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
+gem 'rails', '~> 5.0.2'
+# Use sqlite3 as the database for Active Record
+gem 'sqlite3'
+# Use Puma as the app server
+gem 'puma', '~> 3.0'
+# Use SCSS for stylesheets
+gem 'sass-rails', '~> 5.0'
+# Use Uglifier as compressor for JavaScript assets
+gem 'uglifier', '>= 1.3.0'
+# Use CoffeeScript for .coffee assets and views
+gem 'coffee-rails', '~> 4.2'
+# See https://github.com/rails/execjs#readme for more supported runtimes
+# gem 'therubyracer', platforms: :ruby
+
+# Use jquery as the JavaScript library
+gem 'jquery-rails'
+# 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', '~> 3.0'
+# Use ActiveModel has_secure_password
+# gem 'bcrypt', '~> 3.1.7'
+
+# Use Capistrano for deployment
+# gem 'capistrano-rails', group: :development
+
+group :development, :test do
+ # Call 'byebug' anywhere in the code to stop execution and get a debugger console
+ gem 'byebug', platform: :mri
+end
+
+group :development do
+ # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
+ gem 'web-console', '>= 3.3.0'
+ gem 'listen', '~> 3.0.5'
+ # 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
+
+# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
+gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
diff --git a/README.md b/README.md
index 4e69cc1..c3c2df5 100644
--- a/README.md
+++ b/README.md
@@ -17,8 +17,24 @@ Each requirements section of this assignment has three sections: **think, create
## Primary Requirements
### Create Controller & Model
**Think**:
-- What Rails CLI command do we use to generate a new controller? Are controllers supposed to be singular or plural?
-- What Rails CLI command do we use to generate a new model? Are models supposed to be singular or plural? Where do we put the fields in the migration?
+- What Rails CLI command do we use to generate a new controller?
+ Rails Generate controller name(s) action(optional)
+
+Are controllers supposed to be singular or plural?
+Plural according to conventions.
+
+- What Rails CLI command do we use to generate a new model?
+rails generate model name(singular) data columnns
+
+Are models supposed to be singular or plural?
+Models are singular.
+
+Where do we put the fields in the migration?
+In the migration file, you put name of table, name of column, and data type as such:
+def change
+ add_column :tasks, :complete_by, :date
+ add_column :tasks, :status, :string
+ end
**Create**:
1. a rails controller with the name `animals`
diff --git a/Rakefile b/Rakefile
new file mode 100644
index 0000000..e85f913
--- /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 0000000..b16e53d
--- /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 0000000..e69de29
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
new file mode 100644
index 0000000..b12018d
--- /dev/null
+++ b/app/assets/javascripts/application.js
@@ -0,0 +1,16 @@
+// 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, vendor/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 jquery
+//= require jquery_ujs
+//= require turbolinks
+//= require_tree .
diff --git a/app/assets/javascripts/cable.js b/app/assets/javascripts/cable.js
new file mode 100644
index 0000000..71ee1e6
--- /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 0000000..e69de29
diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css
new file mode 100644
index 0000000..0ebd7fe
--- /dev/null
+++ b/app/assets/stylesheets/application.css
@@ -0,0 +1,15 @@
+/*
+ * 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, vendor/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.
+ *
+ *= require_tree .
+ *= require_self
+ */
diff --git a/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb
new file mode 100644
index 0000000..d672697
--- /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 0000000..0ff5442
--- /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 0000000..1c07694
--- /dev/null
+++ b/app/controllers/application_controller.rb
@@ -0,0 +1,3 @@
+class ApplicationController < ActionController::Base
+ protect_from_forgery with: :exception
+end
diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
new file mode 100644
index 0000000..de6be79
--- /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 0000000..a009ace
--- /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 0000000..286b223
--- /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 0000000..10a4cba
--- /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 0000000..e69de29
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
new file mode 100644
index 0000000..e795ed9
--- /dev/null
+++ b/app/views/layouts/application.html.erb
@@ -0,0 +1,14 @@
+
+
+
+ RailsZoo
+ <%= csrf_meta_tags %>
+
+ <%= 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 0000000..cbd34d2
--- /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 0000000..37f0bdd
--- /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 0000000..66e9889
--- /dev/null
+++ b/bin/bundle
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
+load Gem.bin_path('bundler', 'bundle')
diff --git a/bin/rails b/bin/rails
new file mode 100755
index 0000000..0739660
--- /dev/null
+++ b/bin/rails
@@ -0,0 +1,4 @@
+#!/usr/bin/env ruby
+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 0000000..1724048
--- /dev/null
+++ b/bin/rake
@@ -0,0 +1,4 @@
+#!/usr/bin/env ruby
+require_relative '../config/boot'
+require 'rake'
+Rake.application.run
diff --git a/bin/setup b/bin/setup
new file mode 100755
index 0000000..e620b4d
--- /dev/null
+++ b/bin/setup
@@ -0,0 +1,34 @@
+#!/usr/bin/env ruby
+require 'pathname'
+require 'fileutils'
+include FileUtils
+
+# path to your application root.
+APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
+
+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')
+
+ # 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/update b/bin/update
new file mode 100755
index 0000000..a8e4462
--- /dev/null
+++ b/bin/update
@@ -0,0 +1,29 @@
+#!/usr/bin/env ruby
+require 'pathname'
+require 'fileutils'
+include FileUtils
+
+# path to your application root.
+APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
+
+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')
+
+ 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/config.ru b/config.ru
new file mode 100644
index 0000000..f7ba0b5
--- /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 0000000..43e5fb6
--- /dev/null
+++ b/config/application.rb
@@ -0,0 +1,15 @@
+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 RailsZoo
+ class Application < Rails::Application
+ # Settings in config/environments/* take precedence over those specified here.
+ # Application configuration should go into files in config/initializers
+ # -- all .rb files in that directory are automatically loaded.
+ end
+end
diff --git a/config/boot.rb b/config/boot.rb
new file mode 100644
index 0000000..30f5120
--- /dev/null
+++ b/config/boot.rb
@@ -0,0 +1,3 @@
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
+
+require 'bundler/setup' # Set up gems listed in the Gemfile.
diff --git a/config/cable.yml b/config/cable.yml
new file mode 100644
index 0000000..0bbde6f
--- /dev/null
+++ b/config/cable.yml
@@ -0,0 +1,9 @@
+development:
+ adapter: async
+
+test:
+ adapter: async
+
+production:
+ adapter: redis
+ url: redis://localhost:6379/1
diff --git a/config/database.yml b/config/database.yml
new file mode 100644
index 0000000..1c1a37c
--- /dev/null
+++ b/config/database.yml
@@ -0,0 +1,25 @@
+# SQLite version 3.x
+# gem install sqlite3
+#
+# Ensure the SQLite 3 gem is defined in your Gemfile
+# gem 'sqlite3'
+#
+default: &default
+ adapter: sqlite3
+ pool: 5
+ timeout: 5000
+
+development:
+ <<: *default
+ database: db/development.sqlite3
+
+# 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: db/test.sqlite3
+
+production:
+ <<: *default
+ database: db/production.sqlite3
diff --git a/config/environment.rb b/config/environment.rb
new file mode 100644
index 0000000..426333b
--- /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 0000000..6f71970
--- /dev/null
+++ b/config/environments/development.rb
@@ -0,0 +1,54 @@
+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.
+ 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=172800'
+ }
+ else
+ config.action_controller.perform_caching = false
+
+ config.cache_store = :null_store
+ end
+
+ # 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
+
+ # 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 0000000..a1ba7ef
--- /dev/null
+++ b/config/environments/production.rb
@@ -0,0 +1,86 @@
+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
+
+ # 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
+
+ # 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 = "rails-zoo_#{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 0000000..30587ef
--- /dev/null
+++ b/config/environments/test.rb
@@ -0,0 +1,42 @@
+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=3600'
+ }
+
+ # 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
+ 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/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb
new file mode 100644
index 0000000..51639b6
--- /dev/null
+++ b/config/initializers/application_controller_renderer.rb
@@ -0,0 +1,6 @@
+# Be sure to restart your server when you modify this file.
+
+# ApplicationController.renderer.defaults.merge!(
+# http_host: 'example.org',
+# https: false
+# )
diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb
new file mode 100644
index 0000000..01ef3e6
--- /dev/null
+++ b/config/initializers/assets.rb
@@ -0,0 +1,11 @@
+# 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
+
+# Precompile additional assets.
+# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
+# Rails.application.config.assets.precompile += %w( search.js )
diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb
new file mode 100644
index 0000000..59385cd
--- /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/cookies_serializer.rb b/config/initializers/cookies_serializer.rb
new file mode 100644
index 0000000..5a6a32d
--- /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 0000000..4a994e1
--- /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 0000000..ac033bf
--- /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 0000000..dc18996
--- /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/new_framework_defaults.rb b/config/initializers/new_framework_defaults.rb
new file mode 100644
index 0000000..671abb6
--- /dev/null
+++ b/config/initializers/new_framework_defaults.rb
@@ -0,0 +1,24 @@
+# Be sure to restart your server when you modify this file.
+#
+# This file contains migration options to ease your Rails 5.0 upgrade.
+#
+# Read the Guide for Upgrading Ruby on Rails for more info on each option.
+
+# Enable per-form CSRF tokens. Previous versions had false.
+Rails.application.config.action_controller.per_form_csrf_tokens = true
+
+# Enable origin-checking CSRF mitigation. Previous versions had false.
+Rails.application.config.action_controller.forgery_protection_origin_check = true
+
+# Make Ruby 2.4 preserve the timezone of the receiver when calling `to_time`.
+# Previous versions had false.
+ActiveSupport.to_time_preserves_timezone = true
+
+# Require `belongs_to` associations by default. Previous versions had false.
+Rails.application.config.active_record.belongs_to_required_by_default = true
+
+# Do not halt callback chains when a callback returns false. Previous versions had true.
+ActiveSupport.halt_callback_chains_on_return_false = false
+
+# Configure SSL options to enable HSTS with subdomains. Previous versions had false.
+Rails.application.config.ssl_options = { hsts: { subdomains: true } }
diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb
new file mode 100644
index 0000000..684837f
--- /dev/null
+++ b/config/initializers/session_store.rb
@@ -0,0 +1,3 @@
+# Be sure to restart your server when you modify this file.
+
+Rails.application.config.session_store :cookie_store, key: '_rails-zoo_session'
diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb
new file mode 100644
index 0000000..bbfc396
--- /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 0000000..0653957
--- /dev/null
+++ b/config/locales/en.yml
@@ -0,0 +1,23 @@
+# 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.
+#
+# 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 0000000..c7f311f
--- /dev/null
+++ b/config/puma.rb
@@ -0,0 +1,47 @@
+# 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 }.to_i
+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. If you use this option
+# you need to make sure to reconnect any threads in the `on_worker_boot`
+# block.
+#
+# preload_app!
+
+# The code in the `on_worker_boot` will be called if you are using
+# clustered mode by specifying a number of `workers`. After each worker
+# process is booted this block will be run, if you are using `preload_app!`
+# option you will want to use this block to reconnect to any threads
+# or connections that may have been created at application boot, Ruby
+# cannot share connections between processes.
+#
+# on_worker_boot do
+# ActiveRecord::Base.establish_connection if defined?(ActiveRecord)
+# end
+
+# 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 0000000..787824f
--- /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/secrets.yml b/config/secrets.yml
new file mode 100644
index 0000000..9ae14a9
--- /dev/null
+++ b/config/secrets.yml
@@ -0,0 +1,22 @@
+# Be sure to restart your server when you modify this file.
+
+# Your secret key is used for verifying the integrity of signed cookies.
+# If you change this key, all old signed cookies will become invalid!
+
+# Make sure the secret is at least 30 characters and all random,
+# no regular words or you'll be exposed to dictionary attacks.
+# You can use `rails secret` to generate a secure secret key.
+
+# Make sure the secrets in this file are kept private
+# if you're sharing your code publicly.
+
+development:
+ secret_key_base: 0a3363562eb1b428e2d785a9ef86185d2209981e0bf977e17f0539f70d1dfb3792042f0df362cf90f7c30f8cfb72b162fb6aa228f1126dd1e621d8bad114c700
+
+test:
+ secret_key_base: c984addf93f918f6811d81a492a6af1bc3d10ce59878a38a7b5630ff640f31d4a8471920de964fec07ca2838a3002b75c4f77648b0d188352b3c58b74f00913c
+
+# Do not keep production secrets in the repository,
+# instead read values from the environment.
+production:
+ secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
diff --git a/config/spring.rb b/config/spring.rb
new file mode 100644
index 0000000..c9119b4
--- /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/db/seeds.rb b/db/seeds.rb
new file mode 100644
index 0000000..1beea2a
--- /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 0000000..e69de29
diff --git a/lib/tasks/.keep b/lib/tasks/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/log/.keep b/log/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/public/404.html b/public/404.html
new file mode 100644
index 0000000..b612547
--- /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 0000000..a21f82b
--- /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 0000000..061abc5
--- /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 0000000..e69de29
diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png
new file mode 100644
index 0000000..e69de29
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..e69de29
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..3c9c7c0
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,5 @@
+# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
+#
+# To ban all spiders from the entire site uncomment the next two lines:
+# User-agent: *
+# Disallow: /
diff --git a/test/controllers/.keep b/test/controllers/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/test/fixtures/.keep b/test/fixtures/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/test/fixtures/files/.keep b/test/fixtures/files/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/test/helpers/.keep b/test/helpers/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/test/integration/.keep b/test/integration/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/test/mailers/.keep b/test/mailers/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/test/models/.keep b/test/models/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/test/test_helper.rb b/test/test_helper.rb
new file mode 100644
index 0000000..92e39b2
--- /dev/null
+++ b/test/test_helper.rb
@@ -0,0 +1,10 @@
+ENV['RAILS_ENV'] ||= 'test'
+require File.expand_path('../../config/environment', __FILE__)
+require 'rails/test_help'
+
+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 0000000..e69de29
diff --git a/vendor/assets/javascripts/.keep b/vendor/assets/javascripts/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/assets/stylesheets/.keep b/vendor/assets/stylesheets/.keep
new file mode 100644
index 0000000..e69de29
From dea72988fa7cebc090497a82664ec1ab99e0bc54 Mon Sep 17 00:00:00 2001
From: Lynn Trickey
Date: Tue, 28 Mar 2017 15:09:11 -0700
Subject: [PATCH 02/15] Created animals controller and adjusted route to access
index
---
Gemfile.lock | 174 ++++++++++++++++++++
app/assets/javascripts/animals.coffee | 3 +
app/assets/stylesheets/animals.scss | 3 +
app/controllers/animals_controller.rb | 4 +
app/helpers/animals_helper.rb | 2 +
app/views/animals/index.html.erb | 2 +
config/routes.rb | 3 +
test/controllers/animals_controller_test.rb | 9 +
8 files changed, 200 insertions(+)
create mode 100644 Gemfile.lock
create mode 100644 app/assets/javascripts/animals.coffee
create mode 100644 app/assets/stylesheets/animals.scss
create mode 100644 app/controllers/animals_controller.rb
create mode 100644 app/helpers/animals_helper.rb
create mode 100644 app/views/animals/index.html.erb
create mode 100644 test/controllers/animals_controller_test.rb
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 0000000..559a447
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,174 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ actioncable (5.0.2)
+ actionpack (= 5.0.2)
+ nio4r (>= 1.2, < 3.0)
+ websocket-driver (~> 0.6.1)
+ actionmailer (5.0.2)
+ actionpack (= 5.0.2)
+ actionview (= 5.0.2)
+ activejob (= 5.0.2)
+ mail (~> 2.5, >= 2.5.4)
+ rails-dom-testing (~> 2.0)
+ actionpack (5.0.2)
+ actionview (= 5.0.2)
+ activesupport (= 5.0.2)
+ rack (~> 2.0)
+ rack-test (~> 0.6.3)
+ rails-dom-testing (~> 2.0)
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
+ actionview (5.0.2)
+ activesupport (= 5.0.2)
+ builder (~> 3.1)
+ erubis (~> 2.7.0)
+ rails-dom-testing (~> 2.0)
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
+ activejob (5.0.2)
+ activesupport (= 5.0.2)
+ globalid (>= 0.3.6)
+ activemodel (5.0.2)
+ activesupport (= 5.0.2)
+ activerecord (5.0.2)
+ activemodel (= 5.0.2)
+ activesupport (= 5.0.2)
+ arel (~> 7.0)
+ activesupport (5.0.2)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (~> 0.7)
+ minitest (~> 5.1)
+ tzinfo (~> 1.1)
+ arel (7.1.4)
+ builder (3.2.3)
+ byebug (9.0.6)
+ coffee-rails (4.2.1)
+ coffee-script (>= 2.2.0)
+ railties (>= 4.0.0, < 5.2.x)
+ coffee-script (2.4.1)
+ coffee-script-source
+ execjs
+ coffee-script-source (1.12.2)
+ concurrent-ruby (1.0.5)
+ debug_inspector (0.0.2)
+ erubis (2.7.0)
+ execjs (2.7.0)
+ ffi (1.9.18)
+ globalid (0.3.7)
+ activesupport (>= 4.1.0)
+ i18n (0.8.1)
+ jbuilder (2.6.3)
+ activesupport (>= 3.0.0, < 5.2)
+ multi_json (~> 1.2)
+ jquery-rails (4.2.2)
+ rails-dom-testing (>= 1, < 3)
+ railties (>= 4.2.0)
+ thor (>= 0.14, < 2.0)
+ listen (3.0.8)
+ rb-fsevent (~> 0.9, >= 0.9.4)
+ rb-inotify (~> 0.9, >= 0.9.7)
+ loofah (2.0.3)
+ nokogiri (>= 1.5.9)
+ mail (2.6.4)
+ mime-types (>= 1.16, < 4)
+ method_source (0.8.2)
+ mime-types (3.1)
+ mime-types-data (~> 3.2015)
+ mime-types-data (3.2016.0521)
+ mini_portile2 (2.1.0)
+ minitest (5.10.1)
+ multi_json (1.12.1)
+ nio4r (2.0.0)
+ nokogiri (1.7.1)
+ mini_portile2 (~> 2.1.0)
+ puma (3.8.2)
+ rack (2.0.1)
+ rack-test (0.6.3)
+ rack (>= 1.0)
+ rails (5.0.2)
+ actioncable (= 5.0.2)
+ actionmailer (= 5.0.2)
+ actionpack (= 5.0.2)
+ actionview (= 5.0.2)
+ activejob (= 5.0.2)
+ activemodel (= 5.0.2)
+ activerecord (= 5.0.2)
+ activesupport (= 5.0.2)
+ bundler (>= 1.3.0, < 2.0)
+ railties (= 5.0.2)
+ sprockets-rails (>= 2.0.0)
+ rails-dom-testing (2.0.2)
+ activesupport (>= 4.2.0, < 6.0)
+ nokogiri (~> 1.6)
+ rails-html-sanitizer (1.0.3)
+ loofah (~> 2.0)
+ railties (5.0.2)
+ actionpack (= 5.0.2)
+ activesupport (= 5.0.2)
+ method_source
+ rake (>= 0.8.7)
+ thor (>= 0.18.1, < 2.0)
+ rake (12.0.0)
+ rb-fsevent (0.9.8)
+ rb-inotify (0.9.8)
+ ffi (>= 0.5.0)
+ sass (3.4.23)
+ sass-rails (5.0.6)
+ railties (>= 4.0.0, < 6)
+ sass (~> 3.1)
+ sprockets (>= 2.8, < 4.0)
+ sprockets-rails (>= 2.0, < 4.0)
+ tilt (>= 1.1, < 3)
+ spring (2.0.1)
+ activesupport (>= 4.2)
+ spring-watcher-listen (2.0.1)
+ listen (>= 2.7, < 4.0)
+ spring (>= 1.2, < 3.0)
+ sprockets (3.7.1)
+ concurrent-ruby (~> 1.0)
+ rack (> 1, < 3)
+ sprockets-rails (3.2.0)
+ actionpack (>= 4.0)
+ activesupport (>= 4.0)
+ sprockets (>= 3.0.0)
+ sqlite3 (1.3.13)
+ thor (0.19.4)
+ thread_safe (0.3.6)
+ tilt (2.0.7)
+ turbolinks (5.0.1)
+ turbolinks-source (~> 5)
+ turbolinks-source (5.0.0)
+ tzinfo (1.2.2)
+ thread_safe (~> 0.1)
+ uglifier (3.1.9)
+ execjs (>= 0.3.0, < 3)
+ web-console (3.4.0)
+ actionview (>= 5.0)
+ activemodel (>= 5.0)
+ debug_inspector
+ railties (>= 5.0)
+ websocket-driver (0.6.5)
+ websocket-extensions (>= 0.1.0)
+ websocket-extensions (0.1.2)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ byebug
+ coffee-rails (~> 4.2)
+ jbuilder (~> 2.5)
+ jquery-rails
+ listen (~> 3.0.5)
+ puma (~> 3.0)
+ rails (~> 5.0.2)
+ sass-rails (~> 5.0)
+ spring
+ spring-watcher-listen (~> 2.0.0)
+ sqlite3
+ turbolinks (~> 5)
+ tzinfo-data
+ uglifier (>= 1.3.0)
+ web-console (>= 3.3.0)
+
+BUNDLED WITH
+ 1.14.6
diff --git a/app/assets/javascripts/animals.coffee b/app/assets/javascripts/animals.coffee
new file mode 100644
index 0000000..24f83d1
--- /dev/null
+++ b/app/assets/javascripts/animals.coffee
@@ -0,0 +1,3 @@
+# Place all the behaviors and hooks related to the matching controller here.
+# All this logic will automatically be available in application.js.
+# You can use CoffeeScript in this file: http://coffeescript.org/
diff --git a/app/assets/stylesheets/animals.scss b/app/assets/stylesheets/animals.scss
new file mode 100644
index 0000000..b0d1e49
--- /dev/null
+++ b/app/assets/stylesheets/animals.scss
@@ -0,0 +1,3 @@
+// Place all the styles related to the Animals 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/animals_controller.rb b/app/controllers/animals_controller.rb
new file mode 100644
index 0000000..dae25aa
--- /dev/null
+++ b/app/controllers/animals_controller.rb
@@ -0,0 +1,4 @@
+class AnimalsController < ApplicationController
+ def index
+ end
+end
diff --git a/app/helpers/animals_helper.rb b/app/helpers/animals_helper.rb
new file mode 100644
index 0000000..84e6721
--- /dev/null
+++ b/app/helpers/animals_helper.rb
@@ -0,0 +1,2 @@
+module AnimalsHelper
+end
diff --git a/app/views/animals/index.html.erb b/app/views/animals/index.html.erb
new file mode 100644
index 0000000..8321fa3
--- /dev/null
+++ b/app/views/animals/index.html.erb
@@ -0,0 +1,2 @@
+Animals#index
+Find me in app/views/animals/index.html.erb
diff --git a/config/routes.rb b/config/routes.rb
index 787824f..22f562e 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,3 +1,6 @@
Rails.application.routes.draw do
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
+
+ get '/animals', to: 'animals#index'
+
end
diff --git a/test/controllers/animals_controller_test.rb b/test/controllers/animals_controller_test.rb
new file mode 100644
index 0000000..2bd3abd
--- /dev/null
+++ b/test/controllers/animals_controller_test.rb
@@ -0,0 +1,9 @@
+require 'test_helper'
+
+class AnimalsControllerTest < ActionDispatch::IntegrationTest
+ test "should get index" do
+ get animals_index_url
+ assert_response :success
+ end
+
+end
From e07bd5585f3ebbcd80ec80db51b634fbfeb8206d Mon Sep 17 00:00:00 2001
From: Lynn Trickey
Date: Tue, 28 Mar 2017 15:17:50 -0700
Subject: [PATCH 03/15] Created Animal model & ran migration
---
app/models/animal.rb | 2 ++
db/migrate/20170328221341_create_animals.rb | 11 ++++++++++
db/schema.rb | 23 +++++++++++++++++++++
test/fixtures/animals.yml | 17 +++++++++++++++
test/models/animal_test.rb | 7 +++++++
5 files changed, 60 insertions(+)
create mode 100644 app/models/animal.rb
create mode 100644 db/migrate/20170328221341_create_animals.rb
create mode 100644 db/schema.rb
create mode 100644 test/fixtures/animals.yml
create mode 100644 test/models/animal_test.rb
diff --git a/app/models/animal.rb b/app/models/animal.rb
new file mode 100644
index 0000000..f4ff4d9
--- /dev/null
+++ b/app/models/animal.rb
@@ -0,0 +1,2 @@
+class Animal < ApplicationRecord
+end
diff --git a/db/migrate/20170328221341_create_animals.rb b/db/migrate/20170328221341_create_animals.rb
new file mode 100644
index 0000000..b458905
--- /dev/null
+++ b/db/migrate/20170328221341_create_animals.rb
@@ -0,0 +1,11 @@
+class CreateAnimals < ActiveRecord::Migration[5.0]
+ def change
+ create_table :animals do |t|
+ t.string :name
+ t.string :species
+ t.integer :age
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
new file mode 100644
index 0000000..d53800b
--- /dev/null
+++ b/db/schema.rb
@@ -0,0 +1,23 @@
+# 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: 20170328221341) do
+
+ create_table "animals", force: :cascade do |t|
+ t.string "name"
+ t.string "species"
+ t.integer "age"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
+end
diff --git a/test/fixtures/animals.yml b/test/fixtures/animals.yml
new file mode 100644
index 0000000..7a69978
--- /dev/null
+++ b/test/fixtures/animals.yml
@@ -0,0 +1,17 @@
+# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
+
+one:
+ name: MyString
+ string: MyString
+ species: MyString
+ string: MyString
+ age: MyString
+ Integer: MyString
+
+two:
+ name: MyString
+ string: MyString
+ species: MyString
+ string: MyString
+ age: MyString
+ Integer: MyString
diff --git a/test/models/animal_test.rb b/test/models/animal_test.rb
new file mode 100644
index 0000000..d25e750
--- /dev/null
+++ b/test/models/animal_test.rb
@@ -0,0 +1,7 @@
+require 'test_helper'
+
+class AnimalTest < ActiveSupport::TestCase
+ # test "the truth" do
+ # assert true
+ # end
+end
From 6f5634d8479620613b190d645c3cd9c83b5ee94e Mon Sep 17 00:00:00 2001
From: Lynn Trickey
Date: Tue, 28 Mar 2017 15:29:10 -0700
Subject: [PATCH 04/15] Created index route, action and view
---
README.md | 5 ++++-
app/controllers/animals_controller.rb | 3 +++
app/views/animals/index.html.erb | 7 ++++++-
3 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index c3c2df5..4038c12 100644
--- a/README.md
+++ b/README.md
@@ -51,7 +51,10 @@ def change
### View All Animals
**Think**:
- Which route (including controller#action) do you use for viewing _all_ of a given resource?
-- Which _model method_ do you use to retrieve _every item_ from the database?
+Index. Route is get '/animals', to: 'animals#index'
+
+- Which _model method_ do you use to retrieve _every item_ from the database?
+Animal.all
**Create**:
1. the route
diff --git a/app/controllers/animals_controller.rb b/app/controllers/animals_controller.rb
index dae25aa..bc0b5ba 100644
--- a/app/controllers/animals_controller.rb
+++ b/app/controllers/animals_controller.rb
@@ -1,4 +1,7 @@
class AnimalsController < ApplicationController
+
def index
+ @animals = Animal.all
end
+
end
diff --git a/app/views/animals/index.html.erb b/app/views/animals/index.html.erb
index 8321fa3..39ed6b5 100644
--- a/app/views/animals/index.html.erb
+++ b/app/views/animals/index.html.erb
@@ -1,2 +1,7 @@
Animals#index
-Find me in app/views/animals/index.html.erb
+
+<% @animals.each do |animal| %>
+
+ <%= animal.name %> is a <%= animal.species %> who is <%= animal.age %> years old.
+
+<% end %>
From f9572383c3ba7ae482bfe6e42d73b6a0560efbca Mon Sep 17 00:00:00 2001
From: Lynn Trickey
Date: Tue, 28 Mar 2017 17:14:35 -0700
Subject: [PATCH 05/15] Added show route, method and view
---
README.md | 6 +++---
app/controllers/animals_controller.rb | 4 ++++
app/views/animals/show.html.erb | 7 +++++++
config/routes.rb | 3 ++-
4 files changed, 16 insertions(+), 4 deletions(-)
create mode 100644 app/views/animals/show.html.erb
diff --git a/README.md b/README.md
index 4038c12..5f1ef01 100644
--- a/README.md
+++ b/README.md
@@ -53,7 +53,7 @@ def change
- Which route (including controller#action) do you use for viewing _all_ of a given resource?
Index. Route is get '/animals', to: 'animals#index'
-- Which _model method_ do you use to retrieve _every item_ from the database?
+- Which _model method_ do you use to retrieve _every item_ from the database?
Animal.all
**Create**:
@@ -67,8 +67,8 @@ Animal.all
### View One Animal
**Think**:
-- Which route (including controller#action) do you use for viewing a _single_ resource?
-- Which _model method_ do you use to retrieve a _single_ item from the database?
+- Which route (including controller#action) do you use for viewing a _single_ resource? get '/animals/:id', to: 'animals#show'
+- Which _model method_ do you use to retrieve a _single_ item from the database? Animal.find(:id)
**Create**:
1. the route (including the param)
diff --git a/app/controllers/animals_controller.rb b/app/controllers/animals_controller.rb
index bc0b5ba..e5c5aaf 100644
--- a/app/controllers/animals_controller.rb
+++ b/app/controllers/animals_controller.rb
@@ -4,4 +4,8 @@ def index
@animals = Animal.all
end
+ def show
+ @animal = Animal.find(params[:id])
+ end
+
end
diff --git a/app/views/animals/show.html.erb b/app/views/animals/show.html.erb
new file mode 100644
index 0000000..e3e93de
--- /dev/null
+++ b/app/views/animals/show.html.erb
@@ -0,0 +1,7 @@
+<%= @animal.name %> the <%= @animal.species %>
+
+
+
+
+ <%= @animal.name %> the <%= @animal.species %> is <%= @animal.age %> years old.
+
diff --git a/config/routes.rb b/config/routes.rb
index 22f562e..365378c 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -2,5 +2,6 @@
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
get '/animals', to: 'animals#index'
-
+ get '/animals/:id', to: 'animals#show', as: 'animal'
+
end
From ee7771c2b6cc33daf3a947e511a18dd2facb044a Mon Sep 17 00:00:00 2001
From: Lynn Trickey
Date: Tue, 28 Mar 2017 17:23:19 -0700
Subject: [PATCH 06/15] Added links on index page to show pages for each animal
---
README.md | 10 +++++++++-
app/views/animals/index.html.erb | 2 ++
config/routes.rb | 2 ++
3 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 5f1ef01..817a4e6 100644
--- a/README.md
+++ b/README.md
@@ -83,8 +83,16 @@ Animal.all
### Create an Animal
**Think**:
-- Which **routes** (including controller#action) do you use for creating a new resource? What is the purpose of each route and how do they work together to complete the whole action?
+- Which **routes** (including controller#action) do you use for creating a new resource?
+get '/animals/new', to: animals#new, as: new_animal
+post '/animals', to: animals#create
+
+What is the purpose of each route and how do they work together to complete the whole action?
+Get gets the form to fill out the info for a new Animal.
+Post posts that information and saves it to the database.
+
- Which _model methods_ do you use to create and save a new item to the database?
+Animal.new and Animal.save
**Create**:
1. the routes
diff --git a/app/views/animals/index.html.erb b/app/views/animals/index.html.erb
index 39ed6b5..57e79d8 100644
--- a/app/views/animals/index.html.erb
+++ b/app/views/animals/index.html.erb
@@ -4,4 +4,6 @@
<%= animal.name %> is a <%= animal.species %> who is <%= animal.age %> years old.
+
+ <%= link_to "Details", animal_path(animal.id) %>
<% end %>
diff --git a/config/routes.rb b/config/routes.rb
index 365378c..f48402e 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,6 +1,8 @@
Rails.application.routes.draw do
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
+ get '/animals/new', to: 'animals#new', as: 'new_animal'
+
get '/animals', to: 'animals#index'
get '/animals/:id', to: 'animals#show', as: 'animal'
From 78298141674c571dc8deeb22966f268893c8582c Mon Sep 17 00:00:00 2001
From: Lynn Trickey
Date: Tue, 28 Mar 2017 17:40:49 -0700
Subject: [PATCH 07/15] Added get new and post routes and actions and views
---
app/controllers/animals_controller.rb | 18 ++++++++++++++++++
app/views/animals/index.html.erb | 5 +++++
app/views/animals/new.html.erb | 16 ++++++++++++++++
config/routes.rb | 2 ++
4 files changed, 41 insertions(+)
create mode 100644 app/views/animals/new.html.erb
diff --git a/app/controllers/animals_controller.rb b/app/controllers/animals_controller.rb
index e5c5aaf..c2c293d 100644
--- a/app/controllers/animals_controller.rb
+++ b/app/controllers/animals_controller.rb
@@ -8,4 +8,22 @@ def show
@animal = Animal.find(params[:id])
end
+ def new
+ @animal = Animal.new
+ end
+
+ def create
+ animal = Animal.create animal_params
+
+ unless animal.id == nil
+ redirect_to animals_path
+ end
+ end
+
+ private
+
+ def animal_params
+ params.require(:animal).permit(:name, :species, :age)
+ end
+
end
diff --git a/app/views/animals/index.html.erb b/app/views/animals/index.html.erb
index 57e79d8..a2f6db2 100644
--- a/app/views/animals/index.html.erb
+++ b/app/views/animals/index.html.erb
@@ -6,4 +6,9 @@
<%= link_to "Details", animal_path(animal.id) %>
+
<% end %>
+
+
+ <%= link_to "Add an Animal", new_animal_path %>
+
diff --git a/app/views/animals/new.html.erb b/app/views/animals/new.html.erb
new file mode 100644
index 0000000..76ecd7b
--- /dev/null
+++ b/app/views/animals/new.html.erb
@@ -0,0 +1,16 @@
+Add an Animal
+
+<%= form_for @animal do |f| %>
+
+<%= f.label :name %>
+<%= f.text_field :name %>
+
+<%= f.label :species %>
+<%= f.text_field :species %>
+
+<%= f.label :age %>
+<%= f.text_field :age %>
+
+<%= f.submit "Save" %>
+
+<% end %>
diff --git a/config/routes.rb b/config/routes.rb
index f48402e..9b3903f 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,7 +1,9 @@
Rails.application.routes.draw do
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
+ root 'animals#index'
get '/animals/new', to: 'animals#new', as: 'new_animal'
+ post '/animals', to: 'animals#create'
get '/animals', to: 'animals#index'
get '/animals/:id', to: 'animals#show', as: 'animal'
From 5548f84e35523f82524b207a1d5ccadbdb7bdbec Mon Sep 17 00:00:00 2001
From: Lynn Trickey
Date: Tue, 28 Mar 2017 20:28:20 -0700
Subject: [PATCH 08/15] Added edit and update routes and views
---
app/controllers/animals_controller.rb | 17 +++++++++++++++++
app/views/animals/edit.html.erb | 16 ++++++++++++++++
config/routes.rb | 3 +++
3 files changed, 36 insertions(+)
create mode 100644 app/views/animals/edit.html.erb
diff --git a/app/controllers/animals_controller.rb b/app/controllers/animals_controller.rb
index c2c293d..e177af6 100644
--- a/app/controllers/animals_controller.rb
+++ b/app/controllers/animals_controller.rb
@@ -8,6 +8,23 @@ def show
@animal = Animal.find(params[:id])
end
+ def edit
+ @animal = Animal.find(params[:id])
+ end
+
+ def update
+ animal = Animal.find(params[:id])
+
+ animal.name = animal_params[:name]
+ animal.species = animal_params[:species]
+ animal.age = animal_params[:age]
+
+ if animal.save
+ redirect_to animal_path
+ end
+
+ end
+
def new
@animal = Animal.new
end
diff --git a/app/views/animals/edit.html.erb b/app/views/animals/edit.html.erb
new file mode 100644
index 0000000..745f43c
--- /dev/null
+++ b/app/views/animals/edit.html.erb
@@ -0,0 +1,16 @@
+Test
+
+<%= form_for @animal, method: :put do |f| %>
+
+<%= f.label :name %>
+<%= f.text_field :name %>
+
+<%= f.label :species %>
+<%= f.text_field :species %>
+
+<%= f.label :age %>
+<%= f.text_field :age %>
+
+<%= f.submit "Save" %>
+
+<% end %>
diff --git a/config/routes.rb b/config/routes.rb
index 9b3903f..646082f 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -8,4 +8,7 @@
get '/animals', to: 'animals#index'
get '/animals/:id', to: 'animals#show', as: 'animal'
+ get '/animals/:id/edit', to: 'animals#edit', as: 'edit_animal'
+ put '/animals/:id', to: 'animals#update'
+
end
From 11ea0b11675dc0c80cb6e038790c4ba2c6568b34 Mon Sep 17 00:00:00 2001
From: Lynn Trickey
Date: Tue, 28 Mar 2017 20:47:46 -0700
Subject: [PATCH 09/15] Added Edit and Delete
---
app/controllers/animals_controller.rb | 6 +++++-
app/views/animals/show.html.erb | 6 ++++++
config/routes.rb | 1 +
3 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/app/controllers/animals_controller.rb b/app/controllers/animals_controller.rb
index e177af6..84a2cc4 100644
--- a/app/controllers/animals_controller.rb
+++ b/app/controllers/animals_controller.rb
@@ -22,7 +22,6 @@ def update
if animal.save
redirect_to animal_path
end
-
end
def new
@@ -37,6 +36,11 @@ def create
end
end
+ def destroy
+ Animal.destroy(params[:id])
+ redirect_to animals_path
+ end
+
private
def animal_params
diff --git a/app/views/animals/show.html.erb b/app/views/animals/show.html.erb
index e3e93de..3b27c4f 100644
--- a/app/views/animals/show.html.erb
+++ b/app/views/animals/show.html.erb
@@ -5,3 +5,9 @@
<%= @animal.name %> the <%= @animal.species %> is <%= @animal.age %> years old.
+
+
+ <%= link_to "Edit Animal", edit_animal_path %>
+
+ <%= link_to "Remove Animal", delete_animal_path, method: :delete, data: { confirm: "Are you sure?"} %>
+
diff --git a/config/routes.rb b/config/routes.rb
index 646082f..9fdbadd 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -11,4 +11,5 @@
get '/animals/:id/edit', to: 'animals#edit', as: 'edit_animal'
put '/animals/:id', to: 'animals#update'
+ delete '/animals/:id', to: 'animals#destroy', as: 'delete_animal'
end
From 814af20e920e410017fc73bbbf550d7c9664e998 Mon Sep 17 00:00:00 2001
From: Lynn Trickey
Date: Tue, 28 Mar 2017 21:06:00 -0700
Subject: [PATCH 10/15] added image field in migration, then in edit
---
app/controllers/animals_controller.rb | 3 ++-
app/views/animals/edit.html.erb | 3 +++
app/views/animals/new.html.erb | 3 +++
app/views/animals/show.html.erb | 7 +++++--
db/migrate/20170329034856_add_column_to_animals.rb | 5 +++++
db/schema.rb | 3 ++-
6 files changed, 20 insertions(+), 4 deletions(-)
create mode 100644 db/migrate/20170329034856_add_column_to_animals.rb
diff --git a/app/controllers/animals_controller.rb b/app/controllers/animals_controller.rb
index 84a2cc4..a42b07b 100644
--- a/app/controllers/animals_controller.rb
+++ b/app/controllers/animals_controller.rb
@@ -18,6 +18,7 @@ def update
animal.name = animal_params[:name]
animal.species = animal_params[:species]
animal.age = animal_params[:age]
+ animal.image = animal_params[:image]
if animal.save
redirect_to animal_path
@@ -44,7 +45,7 @@ def destroy
private
def animal_params
- params.require(:animal).permit(:name, :species, :age)
+ params.require(:animal).permit(:name, :species, :age, :image)
end
end
diff --git a/app/views/animals/edit.html.erb b/app/views/animals/edit.html.erb
index 745f43c..d7a2735 100644
--- a/app/views/animals/edit.html.erb
+++ b/app/views/animals/edit.html.erb
@@ -11,6 +11,9 @@
<%= f.label :age %>
<%= f.text_field :age %>
+<%= f.label :image %>
+<%= f.text_field :image %>
+
<%= f.submit "Save" %>
<% end %>
diff --git a/app/views/animals/new.html.erb b/app/views/animals/new.html.erb
index 76ecd7b..ded2944 100644
--- a/app/views/animals/new.html.erb
+++ b/app/views/animals/new.html.erb
@@ -11,6 +11,9 @@
<%= f.label :age %>
<%= f.text_field :age %>
+<%= f.label :image %>
+<%= f.text_field :image %>
+
<%= f.submit "Save" %>
<% end %>
diff --git a/app/views/animals/show.html.erb b/app/views/animals/show.html.erb
index 3b27c4f..81377ed 100644
--- a/app/views/animals/show.html.erb
+++ b/app/views/animals/show.html.erb
@@ -1,7 +1,10 @@
<%= @animal.name %> the <%= @animal.species %>
-
-
+
+ <%= image_tag(@animal.image, alt:"animal photo") %>
+
<%= @animal.name %> the <%= @animal.species %> is <%= @animal.age %> years old.
diff --git a/db/migrate/20170329034856_add_column_to_animals.rb b/db/migrate/20170329034856_add_column_to_animals.rb
new file mode 100644
index 0000000..1aff7d6
--- /dev/null
+++ b/db/migrate/20170329034856_add_column_to_animals.rb
@@ -0,0 +1,5 @@
+class AddColumnToAnimals < ActiveRecord::Migration[5.0]
+ def change
+ add_column :animals, :image, :string
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index d53800b..29713f9 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: 20170328221341) do
+ActiveRecord::Schema.define(version: 20170329034856) do
create_table "animals", force: :cascade do |t|
t.string "name"
@@ -18,6 +18,7 @@
t.integer "age"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
+ t.string "image"
end
end
From 20548c918471cef271c7211b44c55e912efcd3e1 Mon Sep 17 00:00:00 2001
From: Lynn Trickey
Date: Tue, 28 Mar 2017 21:30:56 -0700
Subject: [PATCH 11/15] Added navbar on application.html.erb
---
app/assets/stylesheets/application.css | 25 +++++++++++++++++++++++++
app/views/animals/edit.html.erb | 2 ++
app/views/animals/index.html.erb | 2 +-
app/views/animals/new.html.erb | 2 ++
app/views/animals/show.html.erb | 2 ++
app/views/layouts/application.html.erb | 13 ++++++++++++-
6 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css
index 0ebd7fe..0858c01 100644
--- a/app/assets/stylesheets/application.css
+++ b/app/assets/stylesheets/application.css
@@ -13,3 +13,28 @@
*= require_tree .
*= require_self
*/
+body {
+ margin: 20px 100px;
+}
+
+a {
+ text-decoration: none;
+}
+
+ img {
+ width: 300px;
+ }
+
+h1 {
+ margin-top: 30px;
+}
+
+/*Navigation Bar*/
+.navbar {
+ list-style: none;
+ float: right;
+}
+
+.navbar li {
+ display: inline-block;
+}
diff --git a/app/views/animals/edit.html.erb b/app/views/animals/edit.html.erb
index d7a2735..30ceb03 100644
--- a/app/views/animals/edit.html.erb
+++ b/app/views/animals/edit.html.erb
@@ -17,3 +17,5 @@
<%= f.submit "Save" %>
<% end %>
+
+<%= link_to "Home", animals_path %>
diff --git a/app/views/animals/index.html.erb b/app/views/animals/index.html.erb
index a2f6db2..bff50ca 100644
--- a/app/views/animals/index.html.erb
+++ b/app/views/animals/index.html.erb
@@ -1,4 +1,4 @@
-Animals#index
+My Zoo
<% @animals.each do |animal| %>
diff --git a/app/views/animals/new.html.erb b/app/views/animals/new.html.erb
index ded2944..78766d8 100644
--- a/app/views/animals/new.html.erb
+++ b/app/views/animals/new.html.erb
@@ -17,3 +17,5 @@
<%= f.submit "Save" %>
<% end %>
+
+<%= link_to "Home", animals_path %>
diff --git a/app/views/animals/show.html.erb b/app/views/animals/show.html.erb
index 81377ed..67c168c 100644
--- a/app/views/animals/show.html.erb
+++ b/app/views/animals/show.html.erb
@@ -13,4 +13,6 @@
<%= link_to "Edit Animal", edit_animal_path %>
<%= link_to "Remove Animal", delete_animal_path, method: :delete, data: { confirm: "Are you sure?"} %>
+
+ <%= link_to "Home", animals_path %>
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index e795ed9..0d33f16 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -1,7 +1,7 @@
- RailsZoo
+ MyZoo
<%= csrf_meta_tags %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
@@ -9,6 +9,17 @@
+
+
+ -
+ <%= link_to "Home", animals_path %>
+
+ -
+ <%= link_to "Add an Animal", new_animal_path %>
+
+
+
+
<%= yield %>
From 7ed4d3efd90f65f300bcb42611d4ed35fb6cf03a Mon Sep 17 00:00:00 2001
From: Lynn Trickey
Date: Tue, 28 Mar 2017 22:28:55 -0700
Subject: [PATCH 12/15] adding some styling
---
app/assets/images/animals.jpeg | Bin 0 -> 277126 bytes
app/assets/stylesheets/application.css | 42 +++++++++++++++++++++++--
app/views/animals/index.html.erb | 23 +++++++-------
app/views/layouts/application.html.erb | 8 +++--
4 files changed, 57 insertions(+), 16 deletions(-)
create mode 100644 app/assets/images/animals.jpeg
diff --git a/app/assets/images/animals.jpeg b/app/assets/images/animals.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..ca490d2d19c94d79e5bcc1a17eb28da0956ad2e2
GIT binary patch
literal 277126
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