├── .gitignore ├── .rspec ├── Gemfile ├── Gemfile.lock ├── README.md ├── Rakefile ├── app ├── assets │ ├── images │ │ ├── .keep │ │ └── paper.jpg │ ├── javascripts │ │ ├── application.js │ │ ├── bootstrap.js.coffee │ │ ├── companies.coffee │ │ ├── registrations.coffee │ │ └── validation.js │ └── stylesheets │ │ ├── application.css.scss │ │ ├── bootstrap_and_overrides.css │ │ └── bootstrap_and_overrides.css.less ├── controllers │ ├── application_controller.rb │ ├── companies_controller.rb │ ├── concerns │ │ └── .keep │ └── registrations_controller.rb ├── helpers │ ├── application_helper.rb │ ├── companies_helper.rb │ └── registrations_helper.rb ├── mailers │ └── .keep ├── models │ ├── .keep │ ├── company.rb │ ├── concerns │ │ └── .keep │ └── registration.rb └── views │ ├── companies │ ├── _form.html.haml │ ├── edit.html.haml │ ├── index.html.haml │ ├── index.json.jbuilder │ ├── new.html.haml │ ├── show.html.haml │ └── show.json.jbuilder │ ├── layouts │ ├── application.html.haml │ └── registrations.html.haml │ └── registrations │ ├── _form.html.haml │ ├── edit.html.haml │ ├── index.html.haml │ ├── index.json.jbuilder │ ├── new.html.haml │ ├── show.html.haml │ └── show.json.jbuilder ├── bin ├── bundle ├── rails ├── rake ├── setup └── spring ├── config.ru ├── config ├── application.rb ├── boot.rb ├── database.yml ├── environment.rb ├── environments │ ├── development.rb │ ├── production.rb │ └── test.rb ├── initializers │ ├── assets.rb │ ├── backtrace_silencers.rb │ ├── cookies_serializer.rb │ ├── filter_parameter_logging.rb │ ├── inflections.rb │ ├── mime_types.rb │ ├── session_store.rb │ └── wrap_parameters.rb ├── locales │ ├── en.bootstrap.yml │ └── en.yml ├── routes.rb └── secrets.yml ├── db ├── migrate │ ├── 20150707122201_create_registrations.rb │ ├── 20150707153822_add_trigger_to_registrations.rb │ ├── 20150709154854_create_companies.rb │ ├── 20150726234755_add_phone_to_registrations.rb │ └── 20150728204631_add_flagged_to_registrations.rb ├── schema.rb └── seeds.rb ├── development ├── index.html ├── lib ├── assets │ └── .keep └── tasks │ └── .keep ├── log └── .keep ├── public ├── 404.html ├── 422.html ├── 500.html ├── favicon.ico └── robots.txt ├── spec ├── models │ └── registration_spec.rb ├── rails_helper.rb └── spec_helper.rb ├── test ├── controllers │ ├── .keep │ ├── companies_controller_test.rb │ └── registrations_controller_test.rb ├── fixtures │ ├── .keep │ ├── companies.yml │ └── registrations.yml ├── helpers │ └── .keep ├── integration │ └── .keep ├── mailers │ └── .keep ├── models │ ├── .keep │ ├── company_test.rb │ └── registration_test.rb └── test_helper.rb ├── utils.txt └── vendor └── assets ├── javascripts └── .keep └── stylesheets └── .keep /.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/* 16 | !/log/.keep 17 | /tmp 18 | *.swo 19 | *.swn 20 | *.swp 21 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --color 2 | --require spec_helper 3 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | 4 | # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' 5 | gem 'sqlite3_ar_regexp', '~> 2.1' 6 | gem 'rails', '4.2.3' 7 | gem 'twitter-bootstrap-rails' 8 | gem 'therubyracer' 9 | gem 'less-rails' 10 | gem 'haml-rails' 11 | gem 'jquery-datatables-rails', '~> 3.3.0' 12 | # Use sqlite3 as the database for Active Record 13 | gem 'sqlite3' 14 | # Use SCSS for stylesheets 15 | gem 'sass-rails', '~> 5.0' 16 | # Use Uglifier as compressor for JavaScript assets 17 | gem 'uglifier', '>= 1.3.0' 18 | # Use CoffeeScript for .coffee assets and views 19 | gem 'coffee-rails', '~> 4.1.0' 20 | gem 'pry' 21 | gem 'rspec-rails' 22 | # See https://github.com/rails/execjs#readme for more supported runtimes 23 | # gem 'therubyracer', platforms: :ruby 24 | 25 | # Use jquery as the JavaScript library 26 | gem 'jquery-rails' 27 | # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks 28 | # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder 29 | gem 'jbuilder', '~> 2.0' 30 | # bundle exec rake doc:rails generates the API under doc/api. 31 | gem 'sdoc', '~> 0.4.0', group: :doc 32 | 33 | # Use ActiveModel has_secure_password 34 | # gem 'bcrypt', '~> 3.1.7' 35 | 36 | # Use Unicorn as the app server 37 | # gem 'unicorn' 38 | 39 | # Use Capistrano for deployment 40 | # gem 'capistrano-rails', group: :development 41 | 42 | group :development, :test do 43 | # Call 'byebug' anywhere in the code to stop execution and get a debugger console 44 | gem 'byebug' 45 | 46 | # Access an IRB console on exception pages or by using <%= console %> in views 47 | gem 'web-console', '~> 2.0' 48 | 49 | # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring 50 | gem 'spring' 51 | end 52 | 53 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | actionmailer (4.2.3) 5 | actionpack (= 4.2.3) 6 | actionview (= 4.2.3) 7 | activejob (= 4.2.3) 8 | mail (~> 2.5, >= 2.5.4) 9 | rails-dom-testing (~> 1.0, >= 1.0.5) 10 | actionpack (4.2.3) 11 | actionview (= 4.2.3) 12 | activesupport (= 4.2.3) 13 | rack (~> 1.6) 14 | rack-test (~> 0.6.2) 15 | rails-dom-testing (~> 1.0, >= 1.0.5) 16 | rails-html-sanitizer (~> 1.0, >= 1.0.2) 17 | actionview (4.2.3) 18 | activesupport (= 4.2.3) 19 | builder (~> 3.1) 20 | erubis (~> 2.7.0) 21 | rails-dom-testing (~> 1.0, >= 1.0.5) 22 | rails-html-sanitizer (~> 1.0, >= 1.0.2) 23 | activejob (4.2.3) 24 | activesupport (= 4.2.3) 25 | globalid (>= 0.3.0) 26 | activemodel (4.2.3) 27 | activesupport (= 4.2.3) 28 | builder (~> 3.1) 29 | activerecord (4.2.3) 30 | activemodel (= 4.2.3) 31 | activesupport (= 4.2.3) 32 | arel (~> 6.0) 33 | activesupport (4.2.3) 34 | i18n (~> 0.7) 35 | json (~> 1.7, >= 1.7.7) 36 | minitest (~> 5.1) 37 | thread_safe (~> 0.3, >= 0.3.4) 38 | tzinfo (~> 1.1) 39 | arel (6.0.0) 40 | binding_of_caller (0.7.2) 41 | debug_inspector (>= 0.0.1) 42 | builder (3.2.2) 43 | byebug (5.0.0) 44 | columnize (= 0.9.0) 45 | coderay (1.1.0) 46 | coffee-rails (4.1.0) 47 | coffee-script (>= 2.2.0) 48 | railties (>= 4.0.0, < 5.0) 49 | coffee-script (2.4.1) 50 | coffee-script-source 51 | execjs 52 | coffee-script-source (1.9.1.1) 53 | columnize (0.9.0) 54 | commonjs (0.2.7) 55 | debug_inspector (0.0.2) 56 | diff-lcs (1.2.5) 57 | erubis (2.7.0) 58 | execjs (2.5.2) 59 | globalid (0.3.5) 60 | activesupport (>= 4.1.0) 61 | haml (4.0.6) 62 | tilt 63 | haml-rails (0.9.0) 64 | actionpack (>= 4.0.1) 65 | activesupport (>= 4.0.1) 66 | haml (>= 4.0.6, < 5.0) 67 | html2haml (>= 1.0.1) 68 | railties (>= 4.0.1) 69 | html2haml (2.0.0) 70 | erubis (~> 2.7.0) 71 | haml (~> 4.0.0) 72 | nokogiri (~> 1.6.0) 73 | ruby_parser (~> 3.5) 74 | i18n (0.7.0) 75 | jbuilder (2.3.1) 76 | activesupport (>= 3.0.0, < 5) 77 | multi_json (~> 1.2) 78 | jquery-datatables-rails (3.3.0) 79 | actionpack (>= 3.1) 80 | jquery-rails 81 | railties (>= 3.1) 82 | sass-rails 83 | jquery-rails (4.0.4) 84 | rails-dom-testing (~> 1.0) 85 | railties (>= 4.2.0) 86 | thor (>= 0.14, < 2.0) 87 | json (1.8.3) 88 | less (2.6.0) 89 | commonjs (~> 0.2.7) 90 | less-rails (2.7.0) 91 | actionpack (>= 4.0) 92 | less (~> 2.6.0) 93 | sprockets (> 2, < 4) 94 | tilt 95 | libv8 (3.16.14.11) 96 | loofah (2.0.2) 97 | nokogiri (>= 1.5.9) 98 | mail (2.6.3) 99 | mime-types (>= 1.16, < 3) 100 | method_source (0.8.2) 101 | mime-types (2.6.1) 102 | mini_portile (0.6.2) 103 | minitest (5.7.0) 104 | multi_json (1.11.2) 105 | nokogiri (1.6.6.2) 106 | mini_portile (~> 0.6.0) 107 | pry (0.10.1) 108 | coderay (~> 1.1.0) 109 | method_source (~> 0.8.1) 110 | slop (~> 3.4) 111 | rack (1.6.4) 112 | rack-test (0.6.3) 113 | rack (>= 1.0) 114 | rails (4.2.3) 115 | actionmailer (= 4.2.3) 116 | actionpack (= 4.2.3) 117 | actionview (= 4.2.3) 118 | activejob (= 4.2.3) 119 | activemodel (= 4.2.3) 120 | activerecord (= 4.2.3) 121 | activesupport (= 4.2.3) 122 | bundler (>= 1.3.0, < 2.0) 123 | railties (= 4.2.3) 124 | sprockets-rails 125 | rails-deprecated_sanitizer (1.0.3) 126 | activesupport (>= 4.2.0.alpha) 127 | rails-dom-testing (1.0.6) 128 | activesupport (>= 4.2.0.beta, < 5.0) 129 | nokogiri (~> 1.6.0) 130 | rails-deprecated_sanitizer (>= 1.0.1) 131 | rails-html-sanitizer (1.0.2) 132 | loofah (~> 2.0) 133 | railties (4.2.3) 134 | actionpack (= 4.2.3) 135 | activesupport (= 4.2.3) 136 | rake (>= 0.8.7) 137 | thor (>= 0.18.1, < 2.0) 138 | rake (10.4.2) 139 | rdoc (4.2.0) 140 | ref (1.0.5) 141 | rspec-core (3.3.1) 142 | rspec-support (~> 3.3.0) 143 | rspec-expectations (3.3.0) 144 | diff-lcs (>= 1.2.0, < 2.0) 145 | rspec-support (~> 3.3.0) 146 | rspec-mocks (3.3.1) 147 | diff-lcs (>= 1.2.0, < 2.0) 148 | rspec-support (~> 3.3.0) 149 | rspec-rails (3.3.2) 150 | actionpack (>= 3.0, < 4.3) 151 | activesupport (>= 3.0, < 4.3) 152 | railties (>= 3.0, < 4.3) 153 | rspec-core (~> 3.3.0) 154 | rspec-expectations (~> 3.3.0) 155 | rspec-mocks (~> 3.3.0) 156 | rspec-support (~> 3.3.0) 157 | rspec-support (3.3.0) 158 | ruby_parser (3.7.0) 159 | sexp_processor (~> 4.1) 160 | sass (3.4.15) 161 | sass-rails (5.0.3) 162 | railties (>= 4.0.0, < 5.0) 163 | sass (~> 3.1) 164 | sprockets (>= 2.8, < 4.0) 165 | sprockets-rails (>= 2.0, < 4.0) 166 | tilt (~> 1.1) 167 | sdoc (0.4.1) 168 | json (~> 1.7, >= 1.7.7) 169 | rdoc (~> 4.0) 170 | sexp_processor (4.6.0) 171 | slop (3.6.0) 172 | spring (1.3.6) 173 | sprockets (3.2.0) 174 | rack (~> 1.0) 175 | sprockets-rails (2.3.2) 176 | actionpack (>= 3.0) 177 | activesupport (>= 3.0) 178 | sprockets (>= 2.8, < 4.0) 179 | sqlite3 (1.3.10) 180 | sqlite3_ar_regexp (2.1.0) 181 | activerecord (>= 3.2, < 5) 182 | sqlite3 183 | therubyracer (0.12.2) 184 | libv8 (~> 3.16.14.0) 185 | ref 186 | thor (0.19.1) 187 | thread_safe (0.3.5) 188 | tilt (1.4.1) 189 | twitter-bootstrap-rails (3.2.0) 190 | actionpack (~> 4.1) 191 | execjs (~> 2.2) 192 | rails (~> 4.1) 193 | railties (~> 4.1) 194 | tzinfo (1.2.2) 195 | thread_safe (~> 0.1) 196 | uglifier (2.7.1) 197 | execjs (>= 0.3.0) 198 | json (>= 1.8.0) 199 | web-console (2.1.3) 200 | activemodel (>= 4.0) 201 | binding_of_caller (>= 0.7.2) 202 | railties (>= 4.0) 203 | sprockets-rails (>= 2.0, < 4.0) 204 | 205 | PLATFORMS 206 | ruby 207 | 208 | DEPENDENCIES 209 | byebug 210 | coffee-rails (~> 4.1.0) 211 | haml-rails 212 | jbuilder (~> 2.0) 213 | jquery-datatables-rails (~> 3.3.0) 214 | jquery-rails 215 | less-rails 216 | pry 217 | rails (= 4.2.3) 218 | rspec-rails 219 | sass-rails (~> 5.0) 220 | sdoc (~> 0.4.0) 221 | spring 222 | sqlite3 223 | sqlite3_ar_regexp (~> 2.1) 224 | therubyracer 225 | twitter-bootstrap-rails 226 | uglifier (>= 1.3.0) 227 | web-console (~> 2.0) 228 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Breaking the Ice With Regular Expressions Watch Us Build 2 | 3 | *We changed the name of this series to "Watch Us Build," so you may see an occasional reference to its former name ("Soup to Bits") in this repository.* 4 | 5 | This is a sample Rails 4 application to test regular expressions on several different layers. 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 | -------------------------------------------------------------------------------- /app/assets/images/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeschool/WatchUsBuild-DataValidationsWithRegEx/1c53e5846481f3f2802ac93dba96c04ea6f5856f/app/assets/images/.keep -------------------------------------------------------------------------------- /app/assets/images/paper.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeschool/WatchUsBuild-DataValidationsWithRegEx/1c53e5846481f3f2802ac93dba96c04ea6f5856f/app/assets/images/paper.jpg -------------------------------------------------------------------------------- /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 any plugin's vendor/assets/javascripts directory 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/rails/sprockets#sprockets-directives) for details 11 | // about supported directives. 12 | // 13 | //= require jquery 14 | //= require jquery_ujs 15 | //= require dataTables/jquery.dataTables 16 | //= require twitter/bootstrap 17 | //= require_tree . 18 | -------------------------------------------------------------------------------- /app/assets/javascripts/bootstrap.js.coffee: -------------------------------------------------------------------------------- 1 | jQuery -> 2 | $("a[rel~=popover], .has-popover").popover() 3 | $("a[rel~=tooltip], .has-tooltip").tooltip() 4 | -------------------------------------------------------------------------------- /app/assets/javascripts/companies.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/registrations.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/validation.js: -------------------------------------------------------------------------------- 1 | var Validation = function(){ 2 | 3 | } 4 | 5 | Validation.prototype.checkName = function(){ 6 | this.nameError = $('.nameError'); 7 | this.nameEle = $('#registration_name') 8 | form = $('#new_registration'); 9 | var me = this; 10 | form.submit(event, function(){ 11 | me.validateName() 12 | }) 13 | } 14 | 15 | Validation.prototype.validateName = function(){ 16 | var name = this.nameEle.val(); 17 | //acutally check pattern here! 18 | 19 | } 20 | 21 | Validation.prototype.addError = function(){ 22 | this.nameEle.addClass('error').removeClass('good') 23 | this.nameError.html('Your name only be lowercase letters and spaces.') 24 | } 25 | 26 | Validation.prototype.addGood = function(){ 27 | this.nameEle.addClass('good').removeClass('error') 28 | this.nameError.html('') 29 | } 30 | 31 | $(document).ready(function(){ 32 | val = new Validation() 33 | val.checkName() 34 | }); 35 | -------------------------------------------------------------------------------- /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 any plugin's vendor/assets/stylesheets directory 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 dataTables/jquery.dataTables 14 | *= require_tree . 15 | *= require_self 16 | */ 17 | 18 | $c-background: #f6f7f7; 19 | $c-background-invert: #fff; 20 | $c-border: #ccc; 21 | $c-primary: #9957d8; 22 | $c-secondary: #42aade; 23 | $c-text: #4d4d4d; 24 | $c-warning: #d7ce5d; 25 | $c-error: #d75d6c; 26 | 27 | $b-borderRadius: 4px; 28 | $b-boxShadow: 0 1px 2px rgba(#000, 0.1); 29 | $b-space: 20px; 30 | $b-space-s: $b-space * 0.5; 31 | $b-space-l: $b-space * 2; 32 | 33 | body { 34 | background: $c-background; 35 | color: $c-text; 36 | } 37 | 38 | h1 { 39 | margin-bottom: $b-space; 40 | } 41 | 42 | a { 43 | color: $c-primary; 44 | } 45 | 46 | /* Utilities */ 47 | 48 | .mbm { 49 | margin-bottom: $b-space; 50 | } 51 | 52 | /* Bootstrap Overrides */ 53 | 54 | .actions { 55 | margin-bottom: $b-space-l; 56 | } 57 | 58 | .btn-primary { 59 | background-color: $c-primary; 60 | border-color: $c-primary; 61 | } 62 | 63 | .btn-primary:active, 64 | .btn-primary:focus, 65 | .btn-primary:hover { 66 | background-color: darken($c-primary, 7%); 67 | border-color: darken($c-primary, 7%); 68 | } 69 | 70 | .btn-info { 71 | background-color: $c-secondary; 72 | border-color: $c-secondary; 73 | } 74 | 75 | .btn-info:active, 76 | .btn-info:focus, 77 | .btn-info:hover { 78 | background-color: darken($c-secondary, 7%); 79 | border-color: darken($c-secondary, 7%); 80 | } 81 | 82 | .btn-warning { 83 | background-color: $c-warning; 84 | border-color: $c-warning; 85 | } 86 | 87 | .btn-warning:active, 88 | .btn-warning:focus, 89 | .btn-warning:hover { 90 | background-color: darken($c-warning, 7%); 91 | border-color: darken($c-warning, 7%); 92 | } 93 | 94 | .field { 95 | margin-bottom: $b-space; 96 | } 97 | 98 | .field > input, 99 | .field > textarea { 100 | border: 1px solid $c-border; 101 | border-radius: $b-borderRadius; 102 | padding: 7px; 103 | } 104 | 105 | .field > input { 106 | font-size: 16px; 107 | margin-right: $b-space-s; 108 | min-width: 300px; 109 | } 110 | 111 | .field label:first-child { 112 | width: 100px; 113 | } 114 | 115 | .field textarea { 116 | font-size: 24px; 117 | min-height: 200px; 118 | width: 100%; 119 | } 120 | 121 | .navbar-default { 122 | background-color: $c-background-invert; 123 | border-color: transparent; 124 | box-shadow: $b-boxShadow; 125 | } 126 | 127 | .navbar-default .navbar-brand { 128 | color: $c-text; 129 | } 130 | 131 | .well { 132 | background: $c-background-invert; 133 | border: 0; 134 | box-shadow: $b-boxShadow; 135 | } 136 | 137 | /* Random */ 138 | 139 | .errors { 140 | color: $c-error; 141 | margin-bottom: $b-space; 142 | } 143 | 144 | .errors-title { 145 | font-size: 20px; 146 | } 147 | 148 | .logo { 149 | height: 100px; 150 | width: 150px; 151 | } 152 | 153 | .nameError{ 154 | color: $c-error; 155 | margin-left: $b-space-s; 156 | } 157 | -------------------------------------------------------------------------------- /app/assets/stylesheets/bootstrap_and_overrides.css: -------------------------------------------------------------------------------- 1 | /* 2 | =require twitter-bootstrap-static/bootstrap 3 | 4 | Use Font Awesome icons (default) 5 | To use Glyphicons sprites instead of Font Awesome, replace with "require twitter-bootstrap-static/sprites" 6 | =require twitter-bootstrap-static/fontawesome 7 | */ -------------------------------------------------------------------------------- /app/assets/stylesheets/bootstrap_and_overrides.css.less: -------------------------------------------------------------------------------- 1 | @import "twitter/bootstrap/bootstrap"; 2 | 3 | // Set the correct sprite paths 4 | @iconSpritePath: image-url("twitter/bootstrap/glyphicons-halflings.png"); 5 | @iconWhiteSpritePath: image-url("twitter/bootstrap/glyphicons-halflings-white.png"); 6 | 7 | // Set the Font Awesome (Font Awesome is default. You can disable by commenting below lines) 8 | @fontAwesomeEotPath: font-url("fontawesome-webfont.eot"); 9 | @fontAwesomeEotPath_iefix: font-url("fontawesome-webfont.eot?#iefix"); 10 | @fontAwesomeWoffPath: font-url("fontawesome-webfont.woff"); 11 | @fontAwesomeTtfPath: font-url("fontawesome-webfont.ttf"); 12 | @fontAwesomeSvgPath: font-url("fontawesome-webfont.svg#fontawesomeregular"); 13 | 14 | // Font Awesome 15 | @import "fontawesome/font-awesome"; 16 | 17 | // Glyphicons 18 | //@import "twitter/bootstrap/glyphicons.less"; 19 | 20 | // Your custom LESS stylesheets goes here 21 | // 22 | // Since bootstrap was imported above you have access to its mixins which 23 | // you may use and inherit here 24 | // 25 | // If you'd like to override bootstrap's own variables, you can do so here as well 26 | // See http://twitter.github.com/bootstrap/customize.html#variables for their names and documentation 27 | // 28 | // Example: 29 | // @link-color: #ff0000; 30 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/controllers/companies_controller.rb: -------------------------------------------------------------------------------- 1 | class CompaniesController < ApplicationController 2 | before_action :set_company, only: [:show, :edit, :update, :destroy] 3 | layout 'registrations' 4 | # GET /companies 5 | # GET /companies.json 6 | def index 7 | @companies = Company.all 8 | end 9 | 10 | # GET /companies/1 11 | # GET /companies/1.json 12 | def show 13 | end 14 | 15 | # GET /companies/new 16 | def new 17 | @company = Company.new 18 | end 19 | 20 | # GET /companies/1/edit 21 | def edit 22 | end 23 | 24 | # POST /companies 25 | # POST /companies.json 26 | def create 27 | @company = Company.new(company_params) 28 | 29 | respond_to do |format| 30 | if @company.save 31 | format.html { redirect_to @company, notice: 'Company was successfully created.' } 32 | format.json { render :show, status: :created, location: @company } 33 | else 34 | format.html { render :new } 35 | format.json { render json: @company.errors, status: :unprocessable_entity } 36 | end 37 | end 38 | end 39 | 40 | # PATCH/PUT /companies/1 41 | # PATCH/PUT /companies/1.json 42 | def update 43 | respond_to do |format| 44 | if @company.update(company_params) 45 | format.html { redirect_to @company, notice: 'Company was successfully updated.' } 46 | format.json { render :show, status: :ok, location: @company } 47 | else 48 | format.html { render :edit } 49 | format.json { render json: @company.errors, status: :unprocessable_entity } 50 | end 51 | end 52 | end 53 | 54 | # DELETE /companies/1 55 | # DELETE /companies/1.json 56 | def destroy 57 | @company.destroy 58 | respond_to do |format| 59 | format.html { redirect_to companies_url, notice: 'Company 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_company 67 | @company = Company.find(params[:id]) 68 | end 69 | 70 | # Never trust parameters from the scary internet, only allow the white list through. 71 | def company_params 72 | params.require(:company).permit(:name, :registration_id) 73 | end 74 | end 75 | -------------------------------------------------------------------------------- /app/controllers/concerns/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeschool/WatchUsBuild-DataValidationsWithRegEx/1c53e5846481f3f2802ac93dba96c04ea6f5856f/app/controllers/concerns/.keep -------------------------------------------------------------------------------- /app/controllers/registrations_controller.rb: -------------------------------------------------------------------------------- 1 | class RegistrationsController < ApplicationController 2 | before_action :set_registration, only: [:show, :edit, :update, :destroy, :clean] 3 | # GET /registrations 4 | # GET /registrations.json 5 | def index 6 | @registrations = Registration.all 7 | end 8 | 9 | def clean 10 | @registration.sub_bad_words 11 | redirect_to :back 12 | end 13 | 14 | # GET /registrations/1 15 | # GET /registrations/1.json 16 | def show 17 | end 18 | 19 | # GET /registrations/new 20 | def new 21 | @registration = Registration.new 22 | end 23 | 24 | # GET /registrations/1/edit 25 | def edit 26 | end 27 | 28 | # POST /registrations 29 | # POST /registrations.json 30 | def create 31 | @registration = Registration.new(registration_params) 32 | 33 | respond_to do |format| 34 | if @registration.save 35 | format.html { redirect_to @registration, notice: 'Registration was successfully created.' } 36 | format.json { render :show, status: :created, location: @registration } 37 | else 38 | format.html { render :new } 39 | format.json { render json: @registration.errors, status: :unprocessable_entity } 40 | end 41 | end 42 | end 43 | 44 | # PATCH/PUT /registrations/1 45 | # PATCH/PUT /registrations/1.json 46 | def update 47 | respond_to do |format| 48 | if @registration.update(registration_params) 49 | format.html { redirect_to @registration, notice: 'Registration was successfully updated.' } 50 | format.json { render :show, status: :ok, location: @registration } 51 | else 52 | format.html { render :edit } 53 | format.json { render json: @registration.errors, status: :unprocessable_entity } 54 | end 55 | end 56 | end 57 | 58 | # DELETE /registrations/1 59 | # DELETE /registrations/1.json 60 | def destroy 61 | @registration.destroy 62 | respond_to do |format| 63 | format.html { redirect_to registrations_url, notice: 'Registration was successfully destroyed.' } 64 | format.json { head :no_content } 65 | end 66 | end 67 | 68 | private 69 | # Use callbacks to share common setup or constraints between actions. 70 | def set_registration 71 | @registration = Registration.find(params[:id]) 72 | end 73 | 74 | # Never trust parameters from the scary internet, only allow the white list through. 75 | def registration_params 76 | params.require(:registration).permit(:name, :email, :comment, :phone) 77 | end 78 | end 79 | -------------------------------------------------------------------------------- /app/helpers/application_helper.rb: -------------------------------------------------------------------------------- 1 | module ApplicationHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/helpers/companies_helper.rb: -------------------------------------------------------------------------------- 1 | module CompaniesHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/helpers/registrations_helper.rb: -------------------------------------------------------------------------------- 1 | module RegistrationsHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/mailers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeschool/WatchUsBuild-DataValidationsWithRegEx/1c53e5846481f3f2802ac93dba96c04ea6f5856f/app/mailers/.keep -------------------------------------------------------------------------------- /app/models/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeschool/WatchUsBuild-DataValidationsWithRegEx/1c53e5846481f3f2802ac93dba96c04ea6f5856f/app/models/.keep -------------------------------------------------------------------------------- /app/models/company.rb: -------------------------------------------------------------------------------- 1 | class Company < ActiveRecord::Base 2 | 3 | belongs_to :registration 4 | 5 | def logo 6 | return '' unless available? 7 | get_logo['responseData']['results'][0]["unescapedUrl"] 8 | end 9 | 10 | private 11 | 12 | def get_logo 13 | @get_logo = begin 14 | uri = URI.parse("http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=#{name}&imgsz=large&as_filetype=jpg") 15 | JSON.parse Net::HTTP.get_response(uri).body 16 | end 17 | end 18 | 19 | def available? 20 | get_logo and 21 | get_logo['responseData'] and 22 | get_logo['responseData']['results'] and 23 | get_logo['responseData']['results'][0] 24 | end 25 | 26 | end 27 | -------------------------------------------------------------------------------- /app/models/concerns/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeschool/WatchUsBuild-DataValidationsWithRegEx/1c53e5846481f3f2802ac93dba96c04ea6f5856f/app/models/concerns/.keep -------------------------------------------------------------------------------- /app/models/registration.rb: -------------------------------------------------------------------------------- 1 | class Registration < ActiveRecord::Base 2 | 3 | has_one :company 4 | 5 | #use rails validates method with regex && validates and how it does not work best 6 | after_save :record_company 7 | 8 | #swap bad words that have regex after them. 9 | def sub_bad_words 10 | 11 | end 12 | 13 | #extract company name from email 14 | def record_company 15 | 16 | end 17 | 18 | end 19 | -------------------------------------------------------------------------------- /app/views/companies/_form.html.haml: -------------------------------------------------------------------------------- 1 | = form_for @company do |f| 2 | - if @company.errors.any? 3 | #error_explanation 4 | %h2= "#{pluralize(@company.errors.count, "error")} prohibited this company from being saved:" 5 | %ul 6 | - @company.errors.full_messages.each do |msg| 7 | %li= msg 8 | 9 | .field 10 | = f.label :name 11 | = f.text_field :name 12 | 13 | .field 14 | = f.label :registration_id 15 | = f.number_field :registration_id 16 | 17 | .actions 18 | = f.submit 'Save', class: 'btn btn-primary' 19 | -------------------------------------------------------------------------------- /app/views/companies/edit.html.haml: -------------------------------------------------------------------------------- 1 | = link_to 'Show', @company 2 | \| 3 | = link_to 'Back', companies_path 4 | 5 | %h1 Editing company 6 | 7 | = render 'form' 8 | -------------------------------------------------------------------------------- /app/views/companies/index.html.haml: -------------------------------------------------------------------------------- 1 | %h1 Listing companies 2 | 3 | .mbm 4 | = link_to 'New Company', new_company_path, class: 'btn btn-primary' 5 | 6 | %table.table 7 | %thead 8 | %tr 9 | %th Name 10 | %th Actions 11 | 12 | %tbody 13 | - @companies.each do |company| 14 | %tr 15 | %td= company.name 16 | %td 17 | = link_to 'View Company', company, class: 'btn btn-info' 18 | = link_to 'Go to registration', registration_path(company), class: 'btn btn-info' 19 | = link_to 'Destroy', company, :method => :delete, :data => { :confirm => 'Are you sure?' }, class: 'btn btn-warning' 20 | 21 | :javascript 22 | $('#table').DataTable() 23 | -------------------------------------------------------------------------------- /app/views/companies/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array!(@companies) do |company| 2 | json.extract! company, :id, :name, :registration_id 3 | json.url company_url(company, format: :json) 4 | end 5 | -------------------------------------------------------------------------------- /app/views/companies/new.html.haml: -------------------------------------------------------------------------------- 1 | = link_to 'Back', companies_path 2 | 3 | %h1 New company 4 | 5 | = render 'form' 6 | -------------------------------------------------------------------------------- /app/views/companies/show.html.haml: -------------------------------------------------------------------------------- 1 | .well 2 | %table.table 3 | %thead 4 | %tr 5 | %th Name 6 | %th Logo 7 | %th Registration 8 | 9 | %tbody 10 | %tr 11 | %td= @company.name 12 | %td= image_tag @company.logo, class: 'logo' 13 | %td= link_to 'View Registration', @company.registration, class: 'btn btn-info' 14 | -------------------------------------------------------------------------------- /app/views/companies/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.extract! @company, :id, :name, :registration_id, :created_at, :updated_at 2 | -------------------------------------------------------------------------------- /app/views/layouts/application.html.haml: -------------------------------------------------------------------------------- 1 | !!! 5 2 | %html(lang="en") 3 | %head 4 | %meta(charset="utf-8") 5 | %meta(http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1") 6 | %meta(name="viewport" content="width=device-width, initial-scale=1.0") 7 | %title= content_for?(:title) ? yield(:title) : "RegexSoupToBits" 8 | = csrf_meta_tags 9 | = stylesheet_link_tag "application", :media => "all" 10 | = favicon_link_tag 'apple-touch-icon-144x144-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '144x144' 11 | = favicon_link_tag 'apple-touch-icon-114x114-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '114x114' 12 | = favicon_link_tag 'apple-touch-icon-72x72-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '72x72' 13 | = favicon_link_tag 'apple-touch-icon-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png' 14 | = favicon_link_tag 'favicon.ico', :rel => 'shortcut icon' 15 | 16 | %body 17 | .navbar.navbar-default.navbar-static-top 18 | .container 19 | %button.navbar-toggle(type="button" data-toggle="collapse" data-target=".navbar-responsive-collapse") 20 | %span.icon-bar 21 | %span.icon-bar 22 | %span.icon-bar 23 | %a.navbar-brand(href="/") RegexSoupToBits 24 | .navbar-collapse.collapse.navbar-responsive-collapse 25 | %ul.nav.navbar-nav 26 | %li= link_to "Register", "/" 27 | %li= link_to "Who Already Registered", "/registrations" 28 | %li= link_to "Companies", "/companies" 29 | 30 | .container 31 | .row 32 | = bootstrap_flash 33 | = yield 34 | 35 | %footer.text-center 36 | %p © Company 2015 37 | 38 | = javascript_include_tag "application" 39 | -------------------------------------------------------------------------------- /app/views/layouts/registrations.html.haml: -------------------------------------------------------------------------------- 1 | !!! 5 2 | %html(lang="en") 3 | %head 4 | %meta(charset="utf-8") 5 | %meta(http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1") 6 | %meta(name="viewport" content="width=device-width, initial-scale=1.0") 7 | %title= content_for?(:title) ? yield(:title) : "RegexSoupToBits" 8 | = csrf_meta_tags 9 | = stylesheet_link_tag "application", :media => "all" 10 | = favicon_link_tag 'apple-touch-icon-144x144-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '144x144' 11 | = favicon_link_tag 'apple-touch-icon-114x114-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '114x114' 12 | = favicon_link_tag 'apple-touch-icon-72x72-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '72x72' 13 | = favicon_link_tag 'apple-touch-icon-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png' 14 | = favicon_link_tag 'favicon.ico', :rel => 'shortcut icon' 15 | 16 | %body 17 | .navbar.navbar-default.navbar-static-top 18 | .container 19 | %button.navbar-toggle(type="button" data-toggle="collapse" data-target=".navbar-responsive-collapse") 20 | %span.icon-bar 21 | %span.icon-bar 22 | %span.icon-bar 23 | %a.navbar-brand(href="/") RegexSoupToBits 24 | .navbar-collapse.collapse.navbar-responsive-collapse 25 | %ul.nav.navbar-nav 26 | %li= link_to "Register", "/" 27 | %li= link_to "Who Already Registered", "/registrations" 28 | %li= link_to "Companies", "/companies" 29 | 30 | .container 31 | .row 32 | = bootstrap_flash 33 | = yield 34 | 35 | %footer.text-center 36 | Breaking the Ice With Regular Expressions Soup 2 Bits 37 | 38 | = javascript_include_tag "application" 39 | -------------------------------------------------------------------------------- /app/views/registrations/_form.html.haml: -------------------------------------------------------------------------------- 1 | = form_for @registration do |f| 2 | - if @registration.errors.any? 3 | .errors 4 | %h2.errors-title= "#{pluralize(@registration.errors.count, "error")} prohibited this registration from being saved:" 5 | %ul.errors-list 6 | - @registration.errors.full_messages.each do |msg| 7 | %li.errors-list-item= msg 8 | 9 | .field 10 | = f.label :phone 11 | = f.text_field :phone 12 | = f.label 'HTML5 Validation / Client' 13 | 14 | .field 15 | = f.label :name 16 | = f.text_field :name 17 | = f.label 'JavaScript / Client' 18 | %span.nameError 19 | 20 | .field 21 | = f.label :email 22 | = f.text_field :email 23 | = f.label 'Ruby on Rails / Server' 24 | 25 | .field 26 | = f.label :comment 27 | = f.label 'sqlite3 / Database' 28 | 29 | .field 30 | = f.text_area :comment 31 | 32 | .actions 33 | = f.submit 'Save', class: 'btn btn-primary' 34 | -------------------------------------------------------------------------------- /app/views/registrations/edit.html.haml: -------------------------------------------------------------------------------- 1 | = link_to 'Show', @registration 2 | \| 3 | = link_to 'Back', registrations_path 4 | 5 | %h1 Editing registration 6 | 7 | = render 'form' 8 | -------------------------------------------------------------------------------- /app/views/registrations/index.html.haml: -------------------------------------------------------------------------------- 1 | %h1 Listing registrations 2 | 3 | .mbm 4 | = link_to 'New Registration', new_registration_path, class: 'btn btn-primary' 5 | = link_to 'View Companies', companies_path, class: 'btn btn-primary' 6 | 7 | %table.table 8 | %thead 9 | %tr 10 | %th Name 11 | %th Email 12 | %th Flagged 13 | %th Actions 14 | 15 | %tbody 16 | - @registrations.each do |registration| 17 | %tr 18 | %td= registration.name 19 | %td= registration.email 20 | %td= registration.flagged 21 | %td 22 | = link_to 'View', registration, class: 'btn btn-info' 23 | = link_to 'Destroy', registration, :method => :delete, :data => { :confirm => 'Are you sure?' }, class: 'btn btn-warning' 24 | 25 | %br 26 | 27 | :javascript 28 | $('#table').DataTable() 29 | -------------------------------------------------------------------------------- /app/views/registrations/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array!(@registrations) do |registration| 2 | json.extract! registration, :id, :name, :email, :comment 3 | json.url registration_url(registration, format: :json) 4 | end 5 | -------------------------------------------------------------------------------- /app/views/registrations/new.html.haml: -------------------------------------------------------------------------------- 1 | = link_to 'Back', registrations_path 2 | 3 | %h1 New registration 4 | 5 | = render 'form' 6 | -------------------------------------------------------------------------------- /app/views/registrations/show.html.haml: -------------------------------------------------------------------------------- 1 | .well 2 | %table.table 3 | %thead 4 | %tr 5 | %th Name 6 | %th Email 7 | %th Flagged 8 | %th Actions 9 | %th Comment 10 | 11 | %tbody 12 | %tr 13 | %td= @registration.name 14 | %td= @registration.email 15 | %td= @registration.flagged 16 | %td 17 | = link_to 'Show Company Info', (@registration.company || '#'), class: 'btn btn-info' 18 | = link_to 'Clean Bad Words', clean_path(id: @registration.id), class: 'btn btn-primary' 19 | %td= @registration.comment 20 | -------------------------------------------------------------------------------- /app/views/registrations/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.extract! @registration, :id, :name, :email, :comment, :created_at, :updated_at 2 | -------------------------------------------------------------------------------- /bin/bundle: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 3 | load Gem.bin_path('bundler', 'bundle') 4 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /bin/rake: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | begin 3 | load File.expand_path("../spring", __FILE__) 4 | rescue LoadError 5 | end 6 | require_relative '../config/boot' 7 | require 'rake' 8 | Rake.application.run 9 | -------------------------------------------------------------------------------- /bin/setup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require 'pathname' 3 | 4 | # path to your application root. 5 | APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) 6 | 7 | Dir.chdir APP_ROOT do 8 | # This script is a starting point to setup your application. 9 | # Add necessary setup steps to this file: 10 | 11 | puts "== Installing dependencies ==" 12 | system "gem install bundler --conservative" 13 | system "bundle check || bundle install" 14 | 15 | # puts "\n== Copying sample files ==" 16 | # unless File.exist?("config/database.yml") 17 | # system "cp config/database.yml.sample config/database.yml" 18 | # end 19 | 20 | puts "\n== Preparing database ==" 21 | system "bin/rake db:setup" 22 | 23 | puts "\n== Removing old logs and tempfiles ==" 24 | system "rm -f log/*" 25 | system "rm -rf tmp/cache" 26 | 27 | puts "\n== Restarting application server ==" 28 | system "touch tmp/restart.txt" 29 | end 30 | -------------------------------------------------------------------------------- /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 | Gem.paths = { "GEM_PATH" => [Bundler.bundle_path.to_s, *Gem.path].uniq } 12 | gem "spring", match[1] 13 | require "spring/binstub" 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /config.ru: -------------------------------------------------------------------------------- 1 | # This file is used by Rack-based servers to start the application. 2 | 3 | require ::File.expand_path('../config/environment', __FILE__) 4 | run Rails.application 5 | -------------------------------------------------------------------------------- /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 RegexSoupToBits 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 | 23 | # Do not swallow errors in after_commit/after_rollback callbacks. 24 | config.active_record.raise_in_transactional_callbacks = true 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /config/boot.rb: -------------------------------------------------------------------------------- 1 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 2 | 3 | require 'bundler/setup' # Set up gems listed in the Gemfile. 4 | -------------------------------------------------------------------------------- /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/environment.rb: -------------------------------------------------------------------------------- 1 | # Load the Rails application. 2 | require File.expand_path('../application', __FILE__) 3 | 4 | # Initialize the Rails application. 5 | Rails.application.initialize! 6 | -------------------------------------------------------------------------------- /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 | # Asset digests allow you to set far-future HTTP expiration dates on all assets, 31 | # yet still be able to expire them through the digest params. 32 | config.assets.digest = true 33 | 34 | # Adds additional error checking when serving assets at runtime. 35 | # Checks for improperly declared sprockets dependencies. 36 | # Raises helpful error messages. 37 | config.assets.raise_runtime_errors = true 38 | 39 | # Raises error for missing translations 40 | # config.action_view.raise_on_missing_translations = true 41 | end 42 | -------------------------------------------------------------------------------- /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 20 | # NGINX, varnish or squid. 21 | # config.action_dispatch.rack_cache = true 22 | 23 | # Disable serving static files from the `/public` folder by default since 24 | # Apache or NGINX already handles this. 25 | config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present? 26 | 27 | # Compress JavaScripts and CSS. 28 | config.assets.js_compressor = :uglifier 29 | # config.assets.css_compressor = :sass 30 | 31 | # Do not fallback to assets pipeline if a precompiled asset is missed. 32 | config.assets.compile = false 33 | 34 | # Asset digests allow you to set far-future HTTP expiration dates on all assets, 35 | # yet still be able to expire them through the digest params. 36 | config.assets.digest = true 37 | 38 | # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb 39 | 40 | # Specifies the header that your server uses for sending files. 41 | # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache 42 | # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX 43 | 44 | # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. 45 | # config.force_ssl = true 46 | 47 | # Use the lowest log level to ensure availability of diagnostic information 48 | # when problems arise. 49 | config.log_level = :debug 50 | 51 | # Prepend all log lines with the following tags. 52 | # config.log_tags = [ :subdomain, :uuid ] 53 | 54 | # Use a different logger for distributed setups. 55 | # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) 56 | 57 | # Use a different cache store in production. 58 | # config.cache_store = :mem_cache_store 59 | 60 | # Enable serving of images, stylesheets, and JavaScripts from an asset server. 61 | # config.action_controller.asset_host = 'http://assets.example.com' 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 | # Use default logging formatter so that PID and timestamp are not suppressed. 75 | config.log_formatter = ::Logger::Formatter.new 76 | 77 | # Do not dump schema after migrations. 78 | config.active_record.dump_schema_after_migration = false 79 | end 80 | -------------------------------------------------------------------------------- /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 file server for tests with Cache-Control for performance. 16 | config.serve_static_files = 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 | # Randomize the order test cases are executed. 35 | config.active_support.test_order = :random 36 | 37 | # Print deprecation notices to the stderr. 38 | config.active_support.deprecation = :stderr 39 | 40 | # Raises error for missing translations 41 | # config.action_view.raise_on_missing_translations = true 42 | end 43 | -------------------------------------------------------------------------------- /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 | # Add additional assets to the asset load path 7 | # Rails.application.config.assets.paths << Emoji.images_path 8 | 9 | # Precompile additional assets. 10 | # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. 11 | # Rails.application.config.assets.precompile += %w( search.js ) 12 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /config/initializers/cookies_serializer.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | Rails.application.config.action_dispatch.cookies_serializer = :json 4 | -------------------------------------------------------------------------------- /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/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/initializers/mime_types.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new mime types for use in respond_to blocks: 4 | # Mime::Type.register "text/richtext", :rtf 5 | -------------------------------------------------------------------------------- /config/initializers/session_store.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | Rails.application.config.session_store :cookie_store, key: '_RegexSoupToBits_session' 4 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /config/locales/en.bootstrap.yml: -------------------------------------------------------------------------------- 1 | # Sample localization file for English. Add more files in this directory for other locales. 2 | # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. 3 | 4 | en: 5 | breadcrumbs: 6 | application: 7 | root: "Index" 8 | pages: 9 | pages: "Pages" 10 | helpers: 11 | actions: "Actions" 12 | links: 13 | back: "Back" 14 | cancel: "Cancel" 15 | confirm: "Are you sure?" 16 | destroy: "Delete" 17 | new: "New" 18 | edit: "Edit" 19 | titles: 20 | edit: "Edit %{model}" 21 | save: "Save %{model}" 22 | new: "New %{model}" 23 | delete: "Delete %{model}" 24 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /config/routes.rb: -------------------------------------------------------------------------------- 1 | Rails.application.routes.draw do 2 | resources :companies 3 | root to: 'registrations#new' 4 | get 'clean' => 'registrations#clean' 5 | resources :registrations 6 | # The priority is based upon order of creation: first created -> highest priority. 7 | # See how all your routes lay out with "rake routes". 8 | 9 | # You can have the root of your site routed with "root" 10 | # root 'welcome#index' 11 | 12 | # Example of regular route: 13 | # get 'products/:id' => 'catalog#view' 14 | 15 | # Example of named route that can be invoked with purchase_url(id: product.id) 16 | # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase 17 | 18 | # Example resource route (maps HTTP verbs to controller actions automatically): 19 | # resources :products 20 | 21 | # Example resource route with options: 22 | # resources :products do 23 | # member do 24 | # get 'short' 25 | # post 'toggle' 26 | # end 27 | # 28 | # collection do 29 | # get 'sold' 30 | # end 31 | # end 32 | 33 | # Example resource route with sub-resources: 34 | # resources :products do 35 | # resources :comments, :sales 36 | # resource :seller 37 | # end 38 | 39 | # Example resource route with more complex sub-resources: 40 | # resources :products do 41 | # resources :comments 42 | # resources :sales do 43 | # get 'recent', on: :collection 44 | # end 45 | # end 46 | 47 | # Example resource route with concerns: 48 | # concern :toggleable do 49 | # post 'toggle' 50 | # end 51 | # resources :posts, concerns: :toggleable 52 | # resources :photos, concerns: :toggleable 53 | 54 | # Example resource route within a namespace: 55 | # namespace :admin do 56 | # # Directs /admin/products/* to Admin::ProductsController 57 | # # (app/controllers/admin/products_controller.rb) 58 | # resources :products 59 | # end 60 | end 61 | -------------------------------------------------------------------------------- /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: f5dc01e59c930663a46f9bf62bd7fd9a80d6618cd34b9199093178311240939bc208c9e8812f221eca6efec2cd3f2dd5fa21af5cacf2b312603c93149fb95e3b 15 | 16 | test: 17 | secret_key_base: 859c5072d2d8164aa5afe127a2b44fd65fa3cfdc6574d63fb7da7a339c5be8452b304e87bc8cdbe231fee34bf9bc93acbf747a0fbb94caf3d08025c4ccc48b7b 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 | -------------------------------------------------------------------------------- /db/migrate/20150707122201_create_registrations.rb: -------------------------------------------------------------------------------- 1 | class CreateRegistrations < ActiveRecord::Migration 2 | def change 3 | create_table :registrations do |t| 4 | t.string :name 5 | t.string :email 6 | t.text :comment 7 | 8 | t.timestamps null: false 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /db/migrate/20150707153822_add_trigger_to_registrations.rb: -------------------------------------------------------------------------------- 1 | class AddTriggerToRegistrations < ActiveRecord::Migration 2 | def self.up 3 | regex = "" 4 | execute <<-SQL 5 | CREATE TRIGGER "check_for_badness" 6 | AFTER INSERT ON "registrations" 7 | BEGIN 8 | UPDATE "registrations" 9 | SET flagged = 'true' 10 | WHERE id = NEW.id AND comment REGEXP "#{regex}"; 11 | END; 12 | SQL 13 | end 14 | def self.down 15 | execute <<-SQL 16 | DROP TRIGGER IF EXISTS "check_for_badness"; 17 | SQL 18 | end 19 | end 20 | 21 | #trigger settings - Changes require: rake db:migrate:redo VERSION=20150707153822 22 | -------------------------------------------------------------------------------- /db/migrate/20150709154854_create_companies.rb: -------------------------------------------------------------------------------- 1 | class CreateCompanies < ActiveRecord::Migration 2 | def change 3 | create_table :companies do |t| 4 | t.string :name 5 | t.integer :registration_id 6 | 7 | t.timestamps null: false 8 | end 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /db/migrate/20150726234755_add_phone_to_registrations.rb: -------------------------------------------------------------------------------- 1 | class AddPhoneToRegistrations < ActiveRecord::Migration 2 | def change 3 | add_column :registrations, :phone, :string 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20150728204631_add_flagged_to_registrations.rb: -------------------------------------------------------------------------------- 1 | class AddFlaggedToRegistrations < ActiveRecord::Migration 2 | def change 3 | add_column :registrations, :flagged, :boolean 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /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: 20150728204631) do 15 | 16 | create_table "companies", force: :cascade do |t| 17 | t.string "name" 18 | t.integer "registration_id" 19 | t.datetime "created_at", null: false 20 | t.datetime "updated_at", null: false 21 | end 22 | 23 | create_table "registrations", force: :cascade do |t| 24 | t.string "name" 25 | t.string "email" 26 | t.text "comment" 27 | t.datetime "created_at", null: false 28 | t.datetime "updated_at", null: false 29 | t.string "phone" 30 | t.boolean "flagged" 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /development: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeschool/WatchUsBuild-DataValidationsWithRegEx/1c53e5846481f3f2802ac93dba96c04ea6f5856f/development -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeschool/WatchUsBuild-DataValidationsWithRegEx/1c53e5846481f3f2802ac93dba96c04ea6f5856f/index.html -------------------------------------------------------------------------------- /lib/assets/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeschool/WatchUsBuild-DataValidationsWithRegEx/1c53e5846481f3f2802ac93dba96c04ea6f5856f/lib/assets/.keep -------------------------------------------------------------------------------- /lib/tasks/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeschool/WatchUsBuild-DataValidationsWithRegEx/1c53e5846481f3f2802ac93dba96c04ea6f5856f/lib/tasks/.keep -------------------------------------------------------------------------------- /log/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeschool/WatchUsBuild-DataValidationsWithRegEx/1c53e5846481f3f2802ac93dba96c04ea6f5856f/log/.keep -------------------------------------------------------------------------------- /public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |You may have mistyped the address or the page may have moved.
63 |If you are the application owner check the logs for more information.
65 |Maybe you tried to change something you didn't have access to.
63 |If you are the application owner check the logs for more information.
65 |If you are the application owner check the logs for more information.
64 |