10 |
--------------------------------------------------------------------------------
/test/fixtures/todo_items.yml:
--------------------------------------------------------------------------------
1 | # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
2 |
3 | one:
4 | content: MyString
5 | todo_list_id:
6 |
7 | two:
8 | content: MyString
9 | todo_list_id:
10 |
--------------------------------------------------------------------------------
/config/initializers/filter_parameter_logging.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # Configure sensitive parameters which will be filtered from the log file.
4 | Rails.application.config.filter_parameters += [:password]
5 |
--------------------------------------------------------------------------------
/config/routes.rb:
--------------------------------------------------------------------------------
1 | Rails.application.routes.draw do
2 |
3 | resources :todo_lists do
4 | resources :todo_items do
5 | member do
6 | patch :complete
7 | end
8 | end
9 | end
10 |
11 | root "todo_lists#index"
12 | end
13 |
--------------------------------------------------------------------------------
/test/fixtures/todo_lists.yml:
--------------------------------------------------------------------------------
1 | # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
2 |
3 | one:
4 | title: MyString
5 | description: MyText
6 |
7 | two:
8 | title: MyString
9 | description: MyText
10 |
--------------------------------------------------------------------------------
/bin/rails:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | begin
3 | load File.expand_path("../spring", __FILE__)
4 | rescue LoadError
5 | end
6 | APP_PATH = File.expand_path('../../config/application', __FILE__)
7 | require_relative '../config/boot'
8 | require 'rails/commands'
9 |
--------------------------------------------------------------------------------
/app/assets/javascripts/todo_items.js.coffee:
--------------------------------------------------------------------------------
1 | # Place all the behaviors and hooks related to the matching controller here.
2 | # All this logic will automatically be available in application.js.
3 | # You can use CoffeeScript in this file: http://coffeescript.org/
4 |
--------------------------------------------------------------------------------
/app/assets/javascripts/todo_lists.js.coffee:
--------------------------------------------------------------------------------
1 | # Place all the behaviors and hooks related to the matching controller here.
2 | # All this logic will automatically be available in application.js.
3 | # You can use CoffeeScript in this file: http://coffeescript.org/
4 |
--------------------------------------------------------------------------------
/app/controllers/application_controller.rb:
--------------------------------------------------------------------------------
1 | class ApplicationController < ActionController::Base
2 | # Prevent CSRF attacks by raising an exception.
3 | # For APIs, you may want to use :null_session instead.
4 | protect_from_forgery with: :exception
5 | end
6 |
--------------------------------------------------------------------------------
/Rakefile:
--------------------------------------------------------------------------------
1 | # Add your own tasks in files placed in lib/tasks ending in .rake,
2 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3 |
4 | require File.expand_path('../config/application', __FILE__)
5 |
6 | Rails.application.load_tasks
7 |
--------------------------------------------------------------------------------
/db/migrate/20141012144309_create_todo_lists.rb:
--------------------------------------------------------------------------------
1 | class CreateTodoLists < ActiveRecord::Migration
2 | def change
3 | create_table :todo_lists do |t|
4 | t.string :title
5 | t.text :description
6 |
7 | t.timestamps
8 | end
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/db/migrate/20141012144541_create_todo_items.rb:
--------------------------------------------------------------------------------
1 | class CreateTodoItems < ActiveRecord::Migration
2 | def change
3 | create_table :todo_items do |t|
4 | t.string :content
5 | t.references :todo_list, index: true
6 |
7 | t.timestamps
8 | end
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/db/seeds.rb:
--------------------------------------------------------------------------------
1 | # This file should contain all the record creation needed to seed the database with its default values.
2 | # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
3 | #
4 | # Examples:
5 | #
6 | # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }])
7 | # Mayor.create(name: 'Emanuel', city: cities.first)
8 |
--------------------------------------------------------------------------------
/test/test_helper.rb:
--------------------------------------------------------------------------------
1 | ENV['RAILS_ENV'] ||= 'test'
2 | require File.expand_path('../../config/environment', __FILE__)
3 | require 'rails/test_help'
4 |
5 | class ActiveSupport::TestCase
6 | # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
7 | fixtures :all
8 |
9 | # Add more helper methods to be used by all tests here...
10 | end
11 |
--------------------------------------------------------------------------------
/app/views/todo_lists/index.html.erb:
--------------------------------------------------------------------------------
1 | <% @todo_lists.each do |todo_list| %>
2 |
3 |
<%= link_to todo_list.title, todo_list %>
4 |
<%= todo_list.description %>
5 |
6 | <% end %>
7 |
8 |
9 | <%= link_to "New Todo List", new_todo_list_path %>
10 |
--------------------------------------------------------------------------------
/config/initializers/assets.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # Version of your assets, change this if you want to expire all your assets.
4 | Rails.application.config.assets.version = '1.0'
5 |
6 | # Precompile additional assets.
7 | # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
8 | # Rails.application.config.assets.precompile += %w( search.js )
9 |
--------------------------------------------------------------------------------
/config/initializers/backtrace_silencers.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
4 | # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
5 |
6 | # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
7 | # Rails.backtrace_cleaner.remove_silencers!
8 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files for more about ignoring files.
2 | #
3 | # If you find yourself ignoring temporary files generated by your text editor
4 | # or operating system, you probably want to add a global ignore instead:
5 | # git config --global core.excludesfile '~/.gitignore_global'
6 |
7 | # Ignore bundler config.
8 | /.bundle
9 |
10 | # Ignore the default SQLite database.
11 | /db/*.sqlite3
12 | /db/*.sqlite3-journal
13 |
14 | # Ignore all logfiles and tempfiles.
15 | /log/*.log
16 | /tmp
17 |
--------------------------------------------------------------------------------
/bin/spring:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 |
3 | # This file loads spring without using Bundler, in order to be fast
4 | # It gets overwritten when you run the `spring binstub` command
5 |
6 | unless defined?(Spring)
7 | require "rubygems"
8 | require "bundler"
9 |
10 | if match = Bundler.default_lockfile.read.match(/^GEM$.*?^ spring \((.*?)\)$.*?^$/m)
11 | ENV["GEM_PATH"] = ([Bundler.bundle_path.to_s] + Gem.path).join(File::PATH_SEPARATOR)
12 | ENV["GEM_HOME"] = ""
13 | Gem.paths = ENV
14 |
15 | gem "spring", match[1]
16 | require "spring/binstub"
17 | end
18 | end
19 |
--------------------------------------------------------------------------------
/config/initializers/wrap_parameters.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # This file contains settings for ActionController::ParamsWrapper which
4 | # is enabled by default.
5 |
6 | # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
7 | ActiveSupport.on_load(:action_controller) do
8 | wrap_parameters format: [:json] if respond_to?(:wrap_parameters)
9 | end
10 |
11 | # To enable root element in JSON for ActiveRecord objects.
12 | # ActiveSupport.on_load(:active_record) do
13 | # self.include_root_in_json = true
14 | # end
15 |
--------------------------------------------------------------------------------
/app/views/todo_lists/show.html.erb:
--------------------------------------------------------------------------------
1 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/config/database.yml:
--------------------------------------------------------------------------------
1 | # SQLite version 3.x
2 | # gem install sqlite3
3 | #
4 | # Ensure the SQLite 3 gem is defined in your Gemfile
5 | # gem 'sqlite3'
6 | #
7 | default: &default
8 | adapter: sqlite3
9 | pool: 5
10 | timeout: 5000
11 |
12 | development:
13 | <<: *default
14 | database: db/development.sqlite3
15 |
16 | # Warning: The database defined as "test" will be erased and
17 | # re-generated from your development database when you run "rake".
18 | # Do not set this db to the same as development or production.
19 | test:
20 | <<: *default
21 | database: db/test.sqlite3
22 |
23 | production:
24 | <<: *default
25 | database: db/production.sqlite3
26 |
--------------------------------------------------------------------------------
/config/initializers/inflections.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # Add new inflection rules using the following format. Inflections
4 | # are locale specific, and you may define rules for as many different
5 | # locales as you wish. All of these examples are active by default:
6 | # ActiveSupport::Inflector.inflections(:en) do |inflect|
7 | # inflect.plural /^(ox)$/i, '\1en'
8 | # inflect.singular /^(ox)en/i, '\1'
9 | # inflect.irregular 'person', 'people'
10 | # inflect.uncountable %w( fish sheep )
11 | # end
12 |
13 | # These inflection rules are supported but not enabled by default:
14 | # ActiveSupport::Inflector.inflections(:en) do |inflect|
15 | # inflect.acronym 'RESTful'
16 | # end
17 |
--------------------------------------------------------------------------------
/config/locales/en.yml:
--------------------------------------------------------------------------------
1 | # Files in the config/locales directory are used for internationalization
2 | # and are automatically loaded by Rails. If you want to use locales other
3 | # than English, add the necessary files in this directory.
4 | #
5 | # To use the locales, use `I18n.t`:
6 | #
7 | # I18n.t 'hello'
8 | #
9 | # In views, this is aliased to just `t`:
10 | #
11 | # <%= t('hello') %>
12 | #
13 | # To use a different locale, set it with `I18n.locale`:
14 | #
15 | # I18n.locale = :es
16 | #
17 | # This would use the information in config/locales/es.yml.
18 | #
19 | # To learn more, please read the Rails Internationalization guide
20 | # available at http://guides.rubyonrails.org/i18n.html.
21 |
22 | en:
23 | hello: "Hello world"
24 |
--------------------------------------------------------------------------------
/README.rdoc:
--------------------------------------------------------------------------------
1 | = Todo App
2 | == Week 6 of my 12 in 12 Challenge
3 |
4 | My goal with this challenge is to teach myself Ruby on Rails by building a new web app (using rails) each week for 12 weeks.
5 |
6 | This week I built a Todo application (Pretty much the 'Hello World' of Development Tutorials). We have the ability to create multiple Todo lists and multiple Todo items for each list, and also the ability to mark an item as complete.
7 |
8 | Interested in learning how to build this application? Watch the {How To Screencast here}[https://www.youtube.com/channel/UCfWZwsP8trUy5uHJg8gcGIQ]
9 |
10 | ---
11 |
12 | You can find me on {Twitter}[http://twitter.com/mackenziechild] or follow along for more Rails on my website {MackenzieChild.me}[http://mackenziechild.me]
--------------------------------------------------------------------------------
/app/assets/javascripts/application.js:
--------------------------------------------------------------------------------
1 | // This is a manifest file that'll be compiled into application.js, which will include all the files
2 | // listed below.
3 | //
4 | // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5 | // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6 | //
7 | // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8 | // compiled file.
9 | //
10 | // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11 | // about supported directives.
12 | //
13 | //= require jquery
14 | //= require jquery_ujs
15 | //= require turbolinks
16 | //= require_tree .
17 |
--------------------------------------------------------------------------------
/app/views/todo_lists/_form.html.erb:
--------------------------------------------------------------------------------
1 | <%= form_for(@todo_list) do |f| %>
2 | <% if @todo_list.errors.any? %>
3 |
4 |
<%= pluralize(@todo_list.errors.count, "error") %> prohibited this todo_list from being saved:
5 |
6 |
7 | <% @todo_list.errors.full_messages.each do |message| %>
8 |
25 | <% end %>
26 |
--------------------------------------------------------------------------------
/app/controllers/todo_items_controller.rb:
--------------------------------------------------------------------------------
1 | class TodoItemsController < ApplicationController
2 | before_action :set_todo_list
3 | before_action :set_todo_item, except: [:create]
4 |
5 | def create
6 | @todo_item = @todo_list.todo_items.create(todo_item_params)
7 | redirect_to @todo_list
8 | end
9 |
10 | def destroy
11 | if @todo_item.destroy
12 | flash[:success] = "Todo List item was deleted."
13 | else
14 | flash[:error] = "Todo List item could not be deleted."
15 | end
16 | redirect_to @todo_list
17 | end
18 |
19 | def complete
20 | @todo_item.update_attribute(:completed_at, Time.now)
21 | redirect_to @todo_list, notice: "Todo item completed"
22 | end
23 |
24 | private
25 |
26 | def set_todo_list
27 | @todo_list = TodoList.find(params[:todo_list_id])
28 | end
29 |
30 | def set_todo_item
31 | @todo_item = @todo_list.todo_items.find(params[:id])
32 | end
33 |
34 | def todo_item_params
35 | params[:todo_item].permit(:content)
36 | end
37 |
38 | end
39 |
--------------------------------------------------------------------------------
/config/secrets.yml:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # Your secret key is used for verifying the integrity of signed cookies.
4 | # If you change this key, all old signed cookies will become invalid!
5 |
6 | # Make sure the secret is at least 30 characters and all random,
7 | # no regular words or you'll be exposed to dictionary attacks.
8 | # You can use `rake secret` to generate a secure secret key.
9 |
10 | # Make sure the secrets in this file are kept private
11 | # if you're sharing your code publicly.
12 |
13 | development:
14 | secret_key_base: e95fa06f3f43d22c5912b5b114aac242bee943bbc462fc52d17d319767458d00c61903cdae0c849c47aeaea7e89237de01eec7bd11181812a273e49ca43fa151
15 |
16 | test:
17 | secret_key_base: b031e4cd1487c837346a0f363955bf95d838c1d40ec9b210adbe1e44513801d8d79e60fac898661774efa3bdc6e6633a05a90bddb639856ba69649de065e60e2
18 |
19 | # Do not keep production secrets in the repository,
20 | # instead read values from the environment.
21 | production:
22 | secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
23 |
--------------------------------------------------------------------------------
/config/application.rb:
--------------------------------------------------------------------------------
1 | require File.expand_path('../boot', __FILE__)
2 |
3 | require 'rails/all'
4 |
5 | # Require the gems listed in Gemfile, including any gems
6 | # you've limited to :test, :development, or :production.
7 | Bundler.require(*Rails.groups)
8 |
9 | module Todo
10 | class Application < Rails::Application
11 | # Settings in config/environments/* take precedence over those specified here.
12 | # Application configuration should go into files in config/initializers
13 | # -- all .rb files in that directory are automatically loaded.
14 |
15 | # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
16 | # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
17 | # config.time_zone = 'Central Time (US & Canada)'
18 |
19 | # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
20 | # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
21 | # config.i18n.default_locale = :de
22 | end
23 | end
24 |
--------------------------------------------------------------------------------
/app/views/todo_items/_todo_item.html.erb:
--------------------------------------------------------------------------------
1 |
2 | <% if todo_item.completed? %>
3 |
4 | <%= link_to complete_todo_list_todo_item_path(@todo_list, todo_item.id), method: :patch do %>
5 |
6 | <% end %>
7 |
8 |
9 |
<%= todo_item.content %>
10 |
11 |
12 | <%= link_to todo_list_todo_item_path(@todo_list, todo_item.id), method: :delete, data: { confirm: "Are you sure?" } do %>
13 |
14 | <% end %>
15 |
16 | <% else %>
17 |
18 | <%= link_to complete_todo_list_todo_item_path(@todo_list, todo_item.id), method: :patch do %>
19 |
20 | <% end %>
21 |
22 |
23 |
<%= todo_item.content %>
24 |
25 |
26 | <%= link_to todo_list_todo_item_path(@todo_list, todo_item.id), method: :delete, data: { confirm: "Are you sure?" } do %>
27 |
28 | <% end %>
29 |
30 | <% end %>
31 |
--------------------------------------------------------------------------------
/db/schema.rb:
--------------------------------------------------------------------------------
1 | # encoding: UTF-8
2 | # This file is auto-generated from the current state of the database. Instead
3 | # of editing this file, please use the migrations feature of Active Record to
4 | # incrementally modify your database, and then regenerate this schema definition.
5 | #
6 | # Note that this schema.rb definition is the authoritative source for your
7 | # database schema. If you need to create the application database on another
8 | # system, you should be using db:schema:load, not running all the migrations
9 | # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10 | # you'll amass, the slower it'll run and the greater likelihood for issues).
11 | #
12 | # It's strongly recommended that you check this file into your version control system.
13 |
14 | ActiveRecord::Schema.define(version: 20141012150146) do
15 |
16 | create_table "todo_items", force: true do |t|
17 | t.string "content"
18 | t.integer "todo_list_id"
19 | t.datetime "created_at"
20 | t.datetime "updated_at"
21 | t.datetime "completed_at"
22 | end
23 |
24 | add_index "todo_items", ["todo_list_id"], name: "index_todo_items_on_todo_list_id"
25 |
26 | create_table "todo_lists", force: true do |t|
27 | t.string "title"
28 | t.text "description"
29 | t.datetime "created_at"
30 | t.datetime "updated_at"
31 | end
32 |
33 | end
34 |
--------------------------------------------------------------------------------
/test/controllers/todo_lists_controller_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 |
3 | class TodoListsControllerTest < ActionController::TestCase
4 | setup do
5 | @todo_list = todo_lists(:one)
6 | end
7 |
8 | test "should get index" do
9 | get :index
10 | assert_response :success
11 | assert_not_nil assigns(:todo_lists)
12 | end
13 |
14 | test "should get new" do
15 | get :new
16 | assert_response :success
17 | end
18 |
19 | test "should create todo_list" do
20 | assert_difference('TodoList.count') do
21 | post :create, todo_list: { description: @todo_list.description, title: @todo_list.title }
22 | end
23 |
24 | assert_redirected_to todo_list_path(assigns(:todo_list))
25 | end
26 |
27 | test "should show todo_list" do
28 | get :show, id: @todo_list
29 | assert_response :success
30 | end
31 |
32 | test "should get edit" do
33 | get :edit, id: @todo_list
34 | assert_response :success
35 | end
36 |
37 | test "should update todo_list" do
38 | patch :update, id: @todo_list, todo_list: { description: @todo_list.description, title: @todo_list.title }
39 | assert_redirected_to todo_list_path(assigns(:todo_list))
40 | end
41 |
42 | test "should destroy todo_list" do
43 | assert_difference('TodoList.count', -1) do
44 | delete :destroy, id: @todo_list
45 | end
46 |
47 | assert_redirected_to todo_lists_path
48 | end
49 | end
50 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 |
4 | # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
5 | gem 'rails', '4.1.5'
6 | # Use sqlite3 as the database for Active Record
7 | gem 'sqlite3'
8 | # Use SCSS for stylesheets
9 | gem 'sass-rails', '~> 4.0.3'
10 | # Use Uglifier as compressor for JavaScript assets
11 | gem 'uglifier', '>= 1.3.0'
12 | # Use CoffeeScript for .js.coffee assets and views
13 | gem 'coffee-rails', '~> 4.0.0'
14 | # See https://github.com/sstephenson/execjs#readme for more supported runtimes
15 | # gem 'therubyracer', platforms: :ruby
16 |
17 | # Use jquery as the JavaScript library
18 | gem 'jquery-rails'
19 | # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
20 | gem 'turbolinks'
21 | # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
22 | gem 'jbuilder', '~> 2.0'
23 | # bundle exec rake doc:rails generates the API under doc/api.
24 | gem 'sdoc', '~> 0.4.0', group: :doc
25 |
26 | # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
27 | gem 'spring', group: :development
28 |
29 | # Use ActiveModel has_secure_password
30 | # gem 'bcrypt', '~> 3.1.7'
31 |
32 | # Use unicorn as the app server
33 | # gem 'unicorn'
34 |
35 | # Use Capistrano for deployment
36 | # gem 'capistrano-rails', group: :development
37 |
38 | # Use debugger
39 | # gem 'debugger', group: [:development, :test]
40 |
41 |
--------------------------------------------------------------------------------
/config/environments/development.rb:
--------------------------------------------------------------------------------
1 | Rails.application.configure do
2 | # Settings specified here will take precedence over those in config/application.rb.
3 |
4 | # In the development environment your application's code is reloaded on
5 | # every request. This slows down response time but is perfect for development
6 | # since you don't have to restart the web server when you make code changes.
7 | config.cache_classes = false
8 |
9 | # Do not eager load code on boot.
10 | config.eager_load = false
11 |
12 | # Show full error reports and disable caching.
13 | config.consider_all_requests_local = true
14 | config.action_controller.perform_caching = false
15 |
16 | # Don't care if the mailer can't send.
17 | config.action_mailer.raise_delivery_errors = false
18 |
19 | # Print deprecation notices to the Rails logger.
20 | config.active_support.deprecation = :log
21 |
22 | # Raise an error on page load if there are pending migrations.
23 | config.active_record.migration_error = :page_load
24 |
25 | # Debug mode disables concatenation and preprocessing of assets.
26 | # This option may cause significant delays in view rendering with a large
27 | # number of complex assets.
28 | config.assets.debug = true
29 |
30 | # Adds additional error checking when serving assets at runtime.
31 | # Checks for improperly declared sprockets dependencies.
32 | # Raises helpful error messages.
33 | config.assets.raise_runtime_errors = true
34 |
35 | # Raises error for missing translations
36 | # config.action_view.raise_on_missing_translations = true
37 | end
38 |
--------------------------------------------------------------------------------
/public/500.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | We're sorry, but something went wrong (500)
5 |
6 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
We're sorry, but something went wrong.
62 |
63 |
If you are the application owner check the logs for more information.
64 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/config/environments/test.rb:
--------------------------------------------------------------------------------
1 | Rails.application.configure do
2 | # Settings specified here will take precedence over those in config/application.rb.
3 |
4 | # The test environment is used exclusively to run your application's
5 | # test suite. You never need to work with it otherwise. Remember that
6 | # your test database is "scratch space" for the test suite and is wiped
7 | # and recreated between test runs. Don't rely on the data there!
8 | config.cache_classes = true
9 |
10 | # Do not eager load code on boot. This avoids loading your whole application
11 | # just for the purpose of running a single test. If you are using a tool that
12 | # preloads Rails for running tests, you may have to set it to true.
13 | config.eager_load = false
14 |
15 | # Configure static asset server for tests with Cache-Control for performance.
16 | config.serve_static_assets = true
17 | config.static_cache_control = 'public, max-age=3600'
18 |
19 | # Show full error reports and disable caching.
20 | config.consider_all_requests_local = true
21 | config.action_controller.perform_caching = false
22 |
23 | # Raise exceptions instead of rendering exception templates.
24 | config.action_dispatch.show_exceptions = false
25 |
26 | # Disable request forgery protection in test environment.
27 | config.action_controller.allow_forgery_protection = false
28 |
29 | # Tell Action Mailer not to deliver emails to the real world.
30 | # The :test delivery method accumulates sent emails in the
31 | # ActionMailer::Base.deliveries array.
32 | config.action_mailer.delivery_method = :test
33 |
34 | # Print deprecation notices to the stderr.
35 | config.active_support.deprecation = :stderr
36 |
37 | # Raises error for missing translations
38 | # config.action_view.raise_on_missing_translations = true
39 | end
40 |
--------------------------------------------------------------------------------
/public/422.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | The change you wanted was rejected (422)
5 |
6 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
The change you wanted was rejected.
62 |
Maybe you tried to change something you didn't have access to.
63 |
64 |
If you are the application owner check the logs for more information.
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/public/404.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | The page you were looking for doesn't exist (404)
5 |
6 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
The page you were looking for doesn't exist.
62 |
You may have mistyped the address or the page may have moved.
63 |
64 |
If you are the application owner check the logs for more information.
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/app/controllers/todo_lists_controller.rb:
--------------------------------------------------------------------------------
1 | class TodoListsController < ApplicationController
2 | before_action :set_todo_list, only: [:show, :edit, :update, :destroy]
3 |
4 | # GET /todo_lists
5 | # GET /todo_lists.json
6 | def index
7 | @todo_lists = TodoList.all
8 | end
9 |
10 | # GET /todo_lists/1
11 | # GET /todo_lists/1.json
12 | def show
13 | end
14 |
15 | # GET /todo_lists/new
16 | def new
17 | @todo_list = TodoList.new
18 | end
19 |
20 | # GET /todo_lists/1/edit
21 | def edit
22 | end
23 |
24 | # POST /todo_lists
25 | # POST /todo_lists.json
26 | def create
27 | @todo_list = TodoList.new(todo_list_params)
28 |
29 | respond_to do |format|
30 | if @todo_list.save
31 | format.html { redirect_to @todo_list, notice: 'Todo list was successfully created.' }
32 | format.json { render :show, status: :created, location: @todo_list }
33 | else
34 | format.html { render :new }
35 | format.json { render json: @todo_list.errors, status: :unprocessable_entity }
36 | end
37 | end
38 | end
39 |
40 | # PATCH/PUT /todo_lists/1
41 | # PATCH/PUT /todo_lists/1.json
42 | def update
43 | respond_to do |format|
44 | if @todo_list.update(todo_list_params)
45 | format.html { redirect_to @todo_list, notice: 'Todo list was successfully updated.' }
46 | format.json { render :show, status: :ok, location: @todo_list }
47 | else
48 | format.html { render :edit }
49 | format.json { render json: @todo_list.errors, status: :unprocessable_entity }
50 | end
51 | end
52 | end
53 |
54 | # DELETE /todo_lists/1
55 | # DELETE /todo_lists/1.json
56 | def destroy
57 | @todo_list.destroy
58 | respond_to do |format|
59 | format.html { redirect_to root_url, notice: 'Todo list was successfully destroyed.' }
60 | format.json { head :no_content }
61 | end
62 | end
63 |
64 | private
65 | # Use callbacks to share common setup or constraints between actions.
66 | def set_todo_list
67 | @todo_list = TodoList.find(params[:id])
68 | end
69 |
70 | # Never trust parameters from the scary internet, only allow the white list through.
71 | def todo_list_params
72 | params.require(:todo_list).permit(:title, :description)
73 | end
74 | end
75 |
--------------------------------------------------------------------------------
/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: https://rubygems.org/
3 | specs:
4 | actionmailer (4.1.5)
5 | actionpack (= 4.1.5)
6 | actionview (= 4.1.5)
7 | mail (~> 2.5.4)
8 | actionpack (4.1.5)
9 | actionview (= 4.1.5)
10 | activesupport (= 4.1.5)
11 | rack (~> 1.5.2)
12 | rack-test (~> 0.6.2)
13 | actionview (4.1.5)
14 | activesupport (= 4.1.5)
15 | builder (~> 3.1)
16 | erubis (~> 2.7.0)
17 | activemodel (4.1.5)
18 | activesupport (= 4.1.5)
19 | builder (~> 3.1)
20 | activerecord (4.1.5)
21 | activemodel (= 4.1.5)
22 | activesupport (= 4.1.5)
23 | arel (~> 5.0.0)
24 | activesupport (4.1.5)
25 | i18n (~> 0.6, >= 0.6.9)
26 | json (~> 1.7, >= 1.7.7)
27 | minitest (~> 5.1)
28 | thread_safe (~> 0.1)
29 | tzinfo (~> 1.1)
30 | arel (5.0.1.20140414130214)
31 | builder (3.2.2)
32 | coffee-rails (4.0.1)
33 | coffee-script (>= 2.2.0)
34 | railties (>= 4.0.0, < 5.0)
35 | coffee-script (2.3.0)
36 | coffee-script-source
37 | execjs
38 | coffee-script-source (1.8.0)
39 | erubis (2.7.0)
40 | execjs (2.2.1)
41 | hike (1.2.3)
42 | i18n (0.6.11)
43 | jbuilder (2.2.2)
44 | activesupport (>= 3.0.0, < 5)
45 | multi_json (~> 1.2)
46 | jquery-rails (3.1.2)
47 | railties (>= 3.0, < 5.0)
48 | thor (>= 0.14, < 2.0)
49 | json (1.8.1)
50 | mail (2.5.4)
51 | mime-types (~> 1.16)
52 | treetop (~> 1.4.8)
53 | mime-types (1.25.1)
54 | minitest (5.4.2)
55 | multi_json (1.10.1)
56 | polyglot (0.3.5)
57 | rack (1.5.2)
58 | rack-test (0.6.2)
59 | rack (>= 1.0)
60 | rails (4.1.5)
61 | actionmailer (= 4.1.5)
62 | actionpack (= 4.1.5)
63 | actionview (= 4.1.5)
64 | activemodel (= 4.1.5)
65 | activerecord (= 4.1.5)
66 | activesupport (= 4.1.5)
67 | bundler (>= 1.3.0, < 2.0)
68 | railties (= 4.1.5)
69 | sprockets-rails (~> 2.0)
70 | railties (4.1.5)
71 | actionpack (= 4.1.5)
72 | activesupport (= 4.1.5)
73 | rake (>= 0.8.7)
74 | thor (>= 0.18.1, < 2.0)
75 | rake (10.3.2)
76 | rdoc (4.1.2)
77 | json (~> 1.4)
78 | sass (3.2.19)
79 | sass-rails (4.0.3)
80 | railties (>= 4.0.0, < 5.0)
81 | sass (~> 3.2.0)
82 | sprockets (~> 2.8, <= 2.11.0)
83 | sprockets-rails (~> 2.0)
84 | sdoc (0.4.1)
85 | json (~> 1.7, >= 1.7.7)
86 | rdoc (~> 4.0)
87 | spring (1.1.3)
88 | sprockets (2.11.0)
89 | hike (~> 1.2)
90 | multi_json (~> 1.0)
91 | rack (~> 1.0)
92 | tilt (~> 1.1, != 1.3.0)
93 | sprockets-rails (2.2.0)
94 | actionpack (>= 3.0)
95 | activesupport (>= 3.0)
96 | sprockets (>= 2.8, < 4.0)
97 | sqlite3 (1.3.9)
98 | thor (0.19.1)
99 | thread_safe (0.3.4)
100 | tilt (1.4.1)
101 | treetop (1.4.15)
102 | polyglot
103 | polyglot (>= 0.3.1)
104 | turbolinks (2.4.0)
105 | coffee-rails
106 | tzinfo (1.2.2)
107 | thread_safe (~> 0.1)
108 | uglifier (2.5.3)
109 | execjs (>= 0.3.0)
110 | json (>= 1.8.0)
111 |
112 | PLATFORMS
113 | ruby
114 |
115 | DEPENDENCIES
116 | coffee-rails (~> 4.0.0)
117 | jbuilder (~> 2.0)
118 | jquery-rails
119 | rails (= 4.1.5)
120 | sass-rails (~> 4.0.3)
121 | sdoc (~> 0.4.0)
122 | spring
123 | sqlite3
124 | turbolinks
125 | uglifier (>= 1.3.0)
126 |
--------------------------------------------------------------------------------
/config/environments/production.rb:
--------------------------------------------------------------------------------
1 | Rails.application.configure do
2 | # Settings specified here will take precedence over those in config/application.rb.
3 |
4 | # Code is not reloaded between requests.
5 | config.cache_classes = true
6 |
7 | # Eager load code on boot. This eager loads most of Rails and
8 | # your application in memory, allowing both threaded web servers
9 | # and those relying on copy on write to perform better.
10 | # Rake tasks automatically ignore this option for performance.
11 | config.eager_load = true
12 |
13 | # Full error reports are disabled and caching is turned on.
14 | config.consider_all_requests_local = false
15 | config.action_controller.perform_caching = true
16 |
17 | # Enable Rack::Cache to put a simple HTTP cache in front of your application
18 | # Add `rack-cache` to your Gemfile before enabling this.
19 | # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid.
20 | # config.action_dispatch.rack_cache = true
21 |
22 | # Disable Rails's static asset server (Apache or nginx will already do this).
23 | config.serve_static_assets = false
24 |
25 | # Compress JavaScripts and CSS.
26 | config.assets.js_compressor = :uglifier
27 | # config.assets.css_compressor = :sass
28 |
29 | # Do not fallback to assets pipeline if a precompiled asset is missed.
30 | config.assets.compile = false
31 |
32 | # Generate digests for assets URLs.
33 | config.assets.digest = true
34 |
35 | # `config.assets.precompile` has moved to config/initializers/assets.rb
36 |
37 | # Specifies the header that your server uses for sending files.
38 | # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
39 | # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
40 |
41 | # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
42 | # config.force_ssl = true
43 |
44 | # Set to :debug to see everything in the log.
45 | config.log_level = :info
46 |
47 | # Prepend all log lines with the following tags.
48 | # config.log_tags = [ :subdomain, :uuid ]
49 |
50 | # Use a different logger for distributed setups.
51 | # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
52 |
53 | # Use a different cache store in production.
54 | # config.cache_store = :mem_cache_store
55 |
56 | # Enable serving of images, stylesheets, and JavaScripts from an asset server.
57 | # config.action_controller.asset_host = "http://assets.example.com"
58 |
59 | # Precompile additional assets.
60 | # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
61 | # config.assets.precompile += %w( search.js )
62 |
63 | # Ignore bad email addresses and do not raise email delivery errors.
64 | # Set this to true and configure the email server for immediate delivery to raise delivery errors.
65 | # config.action_mailer.raise_delivery_errors = false
66 |
67 | # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
68 | # the I18n.default_locale when a translation cannot be found).
69 | config.i18n.fallbacks = true
70 |
71 | # Send deprecation notices to registered listeners.
72 | config.active_support.deprecation = :notify
73 |
74 | # Disable automatic flushing of the log to improve performance.
75 | # config.autoflush_log = false
76 |
77 | # Use default logging formatter so that PID and timestamp are not suppressed.
78 | config.log_formatter = ::Logger::Formatter.new
79 |
80 | # Do not dump schema after migrations.
81 | config.active_record.dump_schema_after_migration = false
82 | end
83 |
--------------------------------------------------------------------------------
/app/assets/stylesheets/application.css.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * This is a manifest file that'll be compiled into application.css, which will include all the files
3 | * listed below.
4 | *
5 | * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6 | * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7 | *
8 | * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9 | * compiled file so the styles you add here take precedence over styles defined in any styles
10 | * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11 | * file per style scope.
12 | *
13 | *= require_tree .
14 | *= require_self
15 | */
16 |
17 | $white_opaque: rgba(250, 250, 250, .3);
18 | $dark: #1F7972;
19 |
20 | * {
21 | box-sizing: border-box;
22 | }
23 | html {
24 | height: 100%;
25 | }
26 |
27 | body {
28 | height: 100%;
29 | background: -webkit-linear-gradient(40deg, #4CB8C4 10%, #EAECC6 100%);
30 | background: -moz-linear-gradient(40deg, #4CB8C4 10%, #EAECC6 100%);
31 | background: -ms-linear-gradient(40deg, #4CB8C4 10%, #EAECC6 100%);
32 | background: -o-linear-gradient(40deg, #4CB8C4 10%, #EAECC6 100%);
33 | background: linear-gradient(40deg, #4CB8C4 10%, #EAECC6 100%);
34 | font-family: 'Lato', sans-serif;
35 | }
36 |
37 | .clearfix:before,
38 | .clearfix:after {
39 | content: " ";
40 | display: table;
41 | }
42 |
43 | .clearfix:after {
44 | clear: both;
45 | }
46 |
47 | #notice {
48 | text-align: center;
49 | font-size: 0.6em;
50 | color: $dark;
51 | font-weight: 100;
52 | }
53 |
54 | .container {
55 | width: 50%;
56 | max-width: 750px;
57 | background: $white_opaque;
58 | margin: 3em auto 0 auto;
59 | border-radius: 7px;
60 | -webkit-box-shadow: 0 0 4px 3px rgba(0,0,0,.3);
61 | box-shadow: 0 0 4px 4px rgba(0,0,0,.03);
62 | padding: 1em 0;
63 | }
64 |
65 | .todo_list_title {
66 | text-align: center;
67 | font-weight: 700;
68 | font-size: 2.5rem;
69 | text-transform: uppercase;
70 | color: white;
71 | margin: 0;
72 | a {
73 | text-decoration: none;
74 | color: white;
75 | transition: all .4s ease-in-out;
76 | &:hover {
77 | opacity: 0.4;
78 | }
79 | }
80 | }
81 |
82 | .todo_list_sub_title {
83 | margin: 0 0 3em 0;
84 | text-align: center;
85 | font-size: 0.9em;
86 | color: $dark;
87 | font-weight: 100;
88 | }
89 |
90 | .index_row {
91 | padding: 2em;
92 | border-bottom: 1px solid rgba(250,250,250, .3);
93 | .todo_list_sub_title {
94 | margin-bottom: 0;
95 | }
96 | }
97 |
98 | #todo_items_wrapper {
99 | .row {
100 | width: 100%;
101 | border-top: 1px solid rgba(250,250,250, .3);
102 | border-bottom: 1px solid rgba(250,250,250, .3);
103 | .complete {
104 | width: 10%;
105 | float: left;
106 | text-align: center;
107 | border-right: 1px solid rgba(250,250,250, .3);
108 | padding: 1em 0;
109 | }
110 | .todo_item {
111 | width: 80%;
112 | float: left;
113 | p {
114 | margin: 0;
115 | padding: 1em;
116 | color: $dark;
117 | font-weight: 100;
118 | }
119 | }
120 | .trash {
121 | width: 10%;
122 | float: left;
123 | text-align: center;
124 | border-left: 1px solid rgba(250,250,250, .3);
125 | padding: 1em 0;
126 | }
127 | i {
128 | color: white;
129 | transition: all .4s ease-in-out;
130 | &:hover {
131 | color: $dark;
132 | }
133 | }
134 | }
135 | #form {
136 | margin-top: 2em;
137 | padding: 0 5%;
138 | input[type="text"] {
139 | width: 72%;
140 | margin-right: 2%;
141 | display: inline-block;
142 | outline: none;
143 | background: rgba(250,250,250,.4);
144 | border: none;
145 | height: 40px;
146 | border-radius: 4px;
147 | padding: 1em 2em;
148 | }
149 | input[type="submit"] {
150 | background: rgba(250,250,250,.4);
151 | outline: none;
152 | border: none;
153 | height: 40px;
154 | border-radius: 4px;
155 | width: 25%;
156 | display: inline-block;
157 | transition: all .4s ease-in-out;
158 | cursor: pointer;
159 | &:hover {
160 | background: $dark;
161 | }
162 | }
163 | ::-webkit-input-placeholder { color: $dark; }
164 | }
165 | }
166 |
167 | .links {
168 | display: block;
169 | margin: 1.5em auto 0 auto;
170 | text-align: center;
171 | font-size: 0.8em;
172 | color: white;
173 | a {
174 | color: white;
175 | }
176 | }
177 |
178 | .forms {
179 | padding: 0 5%;
180 | }
181 | label {
182 | color: $dark;
183 | }
184 | input[type="text"], textarea {
185 | width: 100%;
186 | margin: .5em 2% 1em 0;
187 | display: inline-block;
188 | outline: none;
189 | background: rgba(250,250,250,.4);
190 | border: none;
191 | height: 40px;
192 | border-radius: 4px;
193 | padding: 1em 2em;
194 | }
195 | textarea {
196 | height: 200px;
197 | }
198 | input[type="submit"] {
199 | background: white;
200 | outline: none;
201 | border: none;
202 | height: 40px;
203 | border-radius: 4px;
204 | width: 25%;
205 | display: inline-block;
206 | transition: all .4s ease-in-out;
207 | cursor: pointer;
208 | color: $dark;
209 | &:hover {
210 | background: $dark;
211 | color: white;
212 | }
213 | }
214 | ::-webkit-input-placeholder { color: $dark; }
215 |
--------------------------------------------------------------------------------