Agile Web Development with Rails, Edition 5

6.1 Iteration A1: Creating the Products Maintenance Application Table of Contents

2 Instant Gratification

We start with a simple "hello world!" demo application and in the process verify that everything is installed correctly.

Create the application

bundle exec /home/rubys/git/rails/railties/exe/rails new demo1 --skip-bundle --skip-listen
      create  
      create  README.md
      create  Rakefile
      create  .ruby-version
      create  config.ru
      create  .gitignore
      create  Gemfile
         run  git init from "."
Initialized empty Git repository in /home/rubys/git/awdwr/edition4/work/demo1/.git/
      create  package.json
      create  app
      create  app/assets/config/manifest.js
      create  app/assets/javascripts/application.js
      create  app/assets/javascripts/cable.js
      create  app/assets/stylesheets/application.css
      create  app/channels/application_cable/channel.rb
      create  app/channels/application_cable/connection.rb
      create  app/controllers/application_controller.rb
      create  app/helpers/application_helper.rb
      create  app/jobs/application_job.rb
      create  app/mailers/application_mailer.rb
      create  app/models/application_record.rb
      create  app/views/layouts/application.html.erb
      create  app/views/layouts/mailer.html.erb
      create  app/views/layouts/mailer.text.erb
      create  app/assets/images/.keep
      create  app/assets/javascripts/channels
      create  app/assets/javascripts/channels/.keep
      create  app/controllers/concerns/.keep
      create  app/models/concerns/.keep
      create  bin
      create  bin/bundle
      create  bin/rails
      create  bin/rake
      create  bin/setup
      create  bin/update
      create  bin/yarn
      create  config
      create  config/routes.rb
      create  config/application.rb
      create  config/environment.rb
      create  config/cable.yml
      create  config/puma.rb
      create  config/spring.rb
      create  config/storage.yml
      create  config/environments
      create  config/environments/development.rb
      create  config/environments/production.rb
      create  config/environments/test.rb
      create  config/initializers
      create  config/initializers/application_controller_renderer.rb
      create  config/initializers/assets.rb
      create  config/initializers/backtrace_silencers.rb
      create  config/initializers/cookies_serializer.rb
      create  config/initializers/cors.rb
      create  config/initializers/filter_parameter_logging.rb
      create  config/initializers/inflections.rb
      create  config/initializers/mime_types.rb
      create  config/initializers/new_framework_defaults_5_2.rb
      create  config/initializers/wrap_parameters.rb
      create  config/locales
      create  config/locales/en.yml
      create  config/master.key
      create  config/boot.rb
      create  config/database.yml
      create  db
      create  db/seeds.rb
      create  lib
      create  lib/tasks
      create  lib/tasks/.keep
      create  lib/assets
      create  lib/assets/.keep
      create  log
      create  log/.keep
      create  public
      create  public/404.html
      create  public/422.html
      create  public/500.html
      create  public/apple-touch-icon-precomposed.png
      create  public/apple-touch-icon.png
      create  public/favicon.ico
      create  public/robots.txt
      create  test/fixtures
      create  test/fixtures/.keep
      create  test/fixtures/files
      create  test/fixtures/files/.keep
      create  test/controllers
      create  test/controllers/.keep
      create  test/mailers
      create  test/mailers/.keep
      create  test/models
      create  test/models/.keep
      create  test/helpers
      create  test/helpers/.keep
      create  test/integration
      create  test/integration/.keep
      create  test/test_helper.rb
      create  test/system
      create  test/system/.keep
      create  test/application_system_test_case.rb
      create  storage
      create  storage/.keep
      create  tmp/storage
      create  tmp/storage/.keep
       exist  tmp
      create  tmp/.keep
      create  tmp/cache
      create  tmp/cache/assets
      create  vendor
      create  vendor/.keep
      remove  config/initializers/cors.rb
      remove  config/initializers/new_framework_defaults_5_2.rb
Active Storage installation was skipped. Please run `bin/rails active_storage:install` to install Active Storage files.
bundle install --local
Resolving dependencies...
Using rake 12.2.1
Using concurrent-ruby 1.0.5
Using i18n 0.9.1
Using minitest 5.10.3
Using thread_safe 0.3.6
Using tzinfo 1.2.4
Using activesupport 5.2.0.alpha from source at `/home/rubys/git/rails`
Using builder 3.2.3
Using erubi 1.7.0
Using mini_portile2 2.3.0
Using nokogiri 1.8.1
Using rails-dom-testing 2.0.3
Using crass 1.0.2
Using loofah 2.1.1
Using rails-html-sanitizer 1.0.3
Using actionview 5.2.0.alpha from source at `/home/rubys/git/rails`
Using rack 2.0.3
Using rack-test 0.7.0
Using actionpack 5.2.0.alpha from source at `/home/rubys/git/rails`
Using nio4r 2.1.0
Using websocket-extensions 0.1.3
Using websocket-driver 0.6.5
Using actioncable 5.2.0.alpha from source at `/home/rubys/git/rails`
Using globalid 0.4.1
Using activejob 5.2.0.alpha from source at `/home/rubys/git/rails`
Using mini_mime 1.0.0
Using mail 2.7.0
Using actionmailer 5.2.0.alpha from source at `/home/rubys/git/rails`
Using activemodel 5.2.0.alpha from source at `/home/rubys/git/rails`
Using arel 9.0.0.alpha from source at `/home/rubys/git/arel`
Using activerecord 5.2.0.alpha from source at `/home/rubys/git/rails`
Using activestorage 5.2.0.alpha from source at `/home/rubys/git/rails`
Using public_suffix 3.0.1
Using addressable 2.5.2
Using io-like 0.3.0
Using archive-zip 0.7.0
Using bindex 0.5.0
Using msgpack 1.1.0
Using bootsnap 1.1.5
Using bundler 1.16.0
Using byebug 9.1.0
Using xpath 2.1.0
Using capybara 2.15.4
Using ffi 1.9.18
Using childprocess 0.8.0
Using chromedriver-helper 1.1.0
Using coffee-script-source 1.12.2
Using execjs 2.7.0
Using coffee-script 2.4.1
Using method_source 0.9.0
Using thor 0.19.4
Using railties 5.2.0.alpha from source at `/home/rubys/git/rails`
Using coffee-rails 4.2.2
Using et-orbi 1.0.8
Using multi_json 1.12.2
Using jbuilder 2.7.0
Using mono_logger 1.1.0
Using mustermann 1.0.1
Using pg 0.19.0
Using puma 3.10.0
Using queue_classic 3.2.0.RC1 from source at `/home/rubys/git/queue_classic`
Using rack-protection 2.0.0
Using sprockets 3.7.1
Using sprockets-rails 3.2.1
Using rails 5.2.0.alpha from source at `/home/rubys/git/rails`
Using rb-fsevent 0.10.2
Using rb-inotify 0.9.9 from source at `/home/rubys/git/rb-inotify`
Using redis 4.0.1
Using redis-namespace 1.6.0
Using tilt 2.0.8
Using sinatra 2.0.0
Using vegas 0.1.11
Using resque 1.27.4
Using rufus-scheduler 3.4.2
Using resque-scheduler 4.3.0 from source at `/home/rubys/git/resque-scheduler`
Using rubyzip 1.2.1
Using sass-listen 4.0.0
Using sass 3.5.3
Using sass-rails 5.0.6 from source at `/home/rubys/git/sass-rails`
Using selenium-webdriver 3.7.0
Using spring 2.0.2
Using sqlite3 1.3.13
Using turbolinks-source 5.0.3
Using turbolinks 5.0.1
Using uglifier 3.2.0
Using web-console 3.5.1 from source at `/home/rubys/git/web-console`
Bundle complete! 20 Gemfile dependencies, 86 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

Start the server.

get /

Ruby on Rails

Yay! You’re on Rails!

Welcome

Rails version: 5.2.0.alpha
Ruby version: 2.4.1 (x86_64-linux)

See what files were created

ls -p
app/	 config.ru  Gemfile.lock  package.json	README.md  tmp/
bin/	 db/	    lib/	  public/	storage/   vendor/
config/  Gemfile    log/	  Rakefile	test/

Create a simple controller

rails generate controller Say hello goodbye
      create  app/controllers/say_controller.rb
       route  get 'say/hello'
get 'say/goodbye'
      invoke  erb
      create    app/views/say
      create    app/views/say/hello.html.erb
      create    app/views/say/goodbye.html.erb
      invoke  test_unit
      create    test/controllers/say_controller_test.rb
      invoke  helper
      create    app/helpers/say_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/say.coffee
      invoke    scss
      create      app/assets/stylesheets/say.scss
edit app/controllers/say_controller.rb
class SayController < ApplicationController
  def hello
  end
 
  def goodbye
  end
end

Restart the server.

Attempt to fetch the file - note that it is missing

get /say/hello

Say#hello

Find me in app/views/say/hello.html.erb

Replace file with a simple hello world

edit app/views/say/hello.html.erb
<h1>Hello from Rails!</h1>

This time it works!

get /say/hello

Hello from Rails!

Add a simple expression

edit app/views/say/hello.html.erb
<h1>Hello from Rails!</h1>
<p>
  It is now <%= Time.now %>
</p>
get /say/hello

Hello from Rails!

It is now 2017-11-13 09:40:34 -0500

Evaluate the expression in the controller.

edit app/controllers/say_controller.rb
class SayController < ApplicationController
  def hello
    @time = Time.now
  end
 
  def goodbye
  end
end

Reference the result in the view.

edit app/views/say/hello.html.erb
<h1>Hello from Rails!</h1>
<p>
  It is now <%= @time %>
</p>
get /say/hello

Hello from Rails!

It is now 2017-11-13 09:40:34 -0500

Replace the goodbye template

edit app/views/say/goodbye.html.erb
<h1>Goodbye!</h1>
<p>
  It was nice having you here.
</p>
get /say/goodbye

Goodbye!

It was nice having you here.

Add a link from the hello page to the goodbye page

edit app/views/say/hello.html.erb
<h1>Hello from Rails!</h1>
<p>
  It is now <%= @time %>
</p>
<p>
  Time to say
  <%= link_to "Goodbye", say_goodbye_path %>!
</p>
get /say/hello

Hello from Rails!

It is now 2017-11-13 09:40:34 -0500

Time to say Goodbye!

Add a link back to the hello page

edit app/views/say/goodbye.html.erb
<h1>Goodbye!</h1>
<p>
  It was nice having you here.
</p>
<p>
  Say <%= link_to "Hello", say_hello_path %> again.
</p>
get /say/goodbye

Goodbye!

It was nice having you here.

Say Hello again.

Intentionally introduce a typo in the code

edit app/controllers/say_controller.rb
class SayController < ApplicationController
  def hello
    @time = Time.know
  end
 
  def goodbye
  end
end
get /say/hello

HTTP Response Code: 500

NoMethodError in SayController#hello

undefined method `know' for Time:Class Did you mean? now

Extracted source (around line #4):
2
3
4
5
6
7
              
def hello
#START_HIGHLIGHT
@time = Time.know
#END_HIGHLIGHT
end

Rails.root: /home/rubys/git/awdwr/edition4/work/demo1

Application Trace | Framework Trace | Full Trace

Request

Parameters:

None

Response

Headers:

None

Intentionally introduce a typo in a URL

get /say/hullo

HTTP Response Code: 404

Routing Error

No route matches [GET] "/say/hullo"

Rails.root: /home/rubys/git/awdwr/edition4/work/demo1

Application Trace | Framework Trace | Full Trace

Routes

Routes match in priority from top to bottom

Helper HTTP Verb Path Controller#Action
Path / Url
say_hello_path GET /say/hello(.:format)

say#hello

say_goodbye_path GET /say/goodbye(.:format)

say#goodbye

Request

Parameters:

None

Response

Headers:

None

6.1 Iteration A1: Creating the Products Maintenance Application Table of Contents