In last few hours, I was creating some application that could work in near future as a blog. But before that good to make some nice structure to have a base of application. So this post is about: how to create a blog using scaffolding. Scaffolding is a quick way to generate some of the most important pieces of an application. If I want to create models, view and also controllers for a new resource in a single operation scaffolding is a great way to make the job quick and easier.

Creating a new rails app is very easy. To do that, I can type only:

rails new scaffold_app

The whole structure of app is as:

drwxr-xr-x  18 andrzejdubaj  staff   612 20 lis 20:40 .
drwxr-xr-x  18 andrzejdubaj  staff   612 20 lis 20:40 ..
-rw-r--r--   1 andrzejdubaj  staff   543 20 lis 20:40 .gitignore
-rw-r--r--   1 andrzejdubaj  staff  1729 20 lis 20:40 Gemfile
-rw-r--r--   1 andrzejdubaj  staff  4330 20 lis 20:40 Gemfile.lock
-rw-r--r--   1 andrzejdubaj  staff   374 20 lis 20:40 README.md
-rw-r--r--   1 andrzejdubaj  staff   227 20 lis 20:40 Rakefile
drwxr-xr-x  10 andrzejdubaj  staff   340 20 lis 20:40 app
drwxr-xr-x   8 andrzejdubaj  staff   272 20 lis 20:40 bin
drwxr-xr-x  14 andrzejdubaj  staff   476 20 lis 20:40 config
-rw-r--r--   1 andrzejdubaj  staff   130 20 lis 20:40 config.ru
drwxr-xr-x   3 andrzejdubaj  staff   102 20 lis 20:40 db
drwxr-xr-x   4 andrzejdubaj  staff   136 20 lis 20:40 lib
drwxr-xr-x   3 andrzejdubaj  staff   102 20 lis 20:40 log
drwxr-xr-x   9 andrzejdubaj  staff   306 20 lis 20:40 public
drwxr-xr-x   9 andrzejdubaj  staff   306 20 lis 20:40 test
drwxr-xr-x   4 andrzejdubaj  staff   136 20 lis 20:40 tmp
drwxr-xr-x   3 andrzejdubaj  staff   102 20 lis 20:40 vendor

To create an MVC components needed to post comments in the scaffold app directory we need to use scaffold generator:

rails generate scaffold post title:string body:text
rails generate scaffold post title:string body:txt
Running via Spring preloader in process 5067
      invoke  active_record
      create    db/migrate/20161120194146_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/models/post_test.rb
      create      test/fixtures/posts.yml
      invoke  resource_route
       route    resources :posts
      invoke  scaffold_controller
      create    app/controllers/posts_controller.rb
      invoke    erb
      create      app/views/posts
      create      app/views/posts/index.html.erb
      create      app/views/posts/edit.html.erb
      create      app/views/posts/show.html.erb
      create      app/views/posts/new.html.erb
      create      app/views/posts/_form.html.erb
      invoke    test_unit
      create      test/controllers/posts_controller_test.rb
      invoke    helper
      create      app/helpers/posts_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/posts/index.json.jbuilder
      create      app/views/posts/show.json.jbuilder
      create      app/views/posts/_post.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/posts.coffee
      invoke    scss
      create      app/assets/stylesheets/posts.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss

And this generator creates post:

rails generate scaffold comment post_id:integer body:text
rails generate scaffold comment post_id:integer body:text
Running via Spring preloader in process 7851
      invoke  active_record
      create    db/migrate/20161120232019_create_comments.rb
      create    app/models/comment.rb
      invoke    test_unit
      create      test/models/comment_test.rb
      create      test/fixtures/comments.yml
      invoke  resource_route
       route    resources :comments
      invoke  scaffold_controller
      create    app/controllers/comments_controller.rb
      invoke    erb
      create      app/views/comments
      create      app/views/comments/index.html.erb
      create      app/views/comments/edit.html.erb
      create      app/views/comments/show.html.erb
      create      app/views/comments/new.html.erb
      create      app/views/comments/_form.html.erb
      invoke    test_unit
      create      test/controllers/comments_controller_test.rb
      invoke    helper
      create      app/helpers/comments_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/comments/index.json.jbuilder
      create      app/views/comments/show.json.jbuilder
      create      app/views/comments/_comment.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/comments.coffee
      invoke    scss
      create      app/assets/stylesheets/comments.scss
      invoke  scss
   identical    app/assets/stylesheets/scaffolds.scss

Creates post and comments tables in database:

rake db:migrate

Rails uses rake commands to run migrations:

Prefix Verb   URI Pattern                  Controller#Action
    comments GET    /comments(.:format)          comments#index
             POST   /comments(.:format)          comments#create
 new_comment GET    /comments/new(.:format)      comments#new
edit_comment GET    /comments/:id/edit(.:format) comments#edit
     comment GET    /comments/:id(.:format)      comments#show
             PATCH  /comments/:id(.:format)      comments#update
             PUT    /comments/:id(.:format)      comments#update
             DELETE /comments/:id(.:format)      comments#destroy
       posts GET    /posts(.:format)             posts#index
             POST   /posts(.:format)             posts#create
    new_post GET    /posts/new(.:format)         posts#new
   edit_post GET    /posts/:id/edit(.:format)    posts#edit
        post GET    /posts/:id(.:format)         posts#show
             PATCH  /posts/:id(.:format)         posts#update
             PUT    /posts/:id(.:format)         posts#update
             DELETE /posts/:id(.:format)         posts#destroy

Rake routes are the lists of all the URLs currently uses in the application.

== 20161120235256 CreatePosts: migrating ======================================
-- create_table(:posts)
   -> 0.0335s
== 20161120235256 CreatePosts: migrated (0.0336s) =============================

== 20161120235304 CreateComments: migrating ===================================
-- create_table(:comments)
   -> 0.0162s
== 20161120235304 CreateComments: migrated (0.0163s) ==========================
Rails scaffold simple app
Rails scaffold simple app

After running rails server we can see that some very simple post and comments formulas were created. Good idea is to add some user with some unique id – integer type, public name – string type, email address – string type that will be used as a username. id, name, email attributes are columns in users table in a database.

Running via Spring preloader in process 9956
      invoke  active_record
      create    db/migrate/20161121001633_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    erb
      create      app/views/users
      create      app/views/users/index.html.erb
      create      app/views/users/edit.html.erb
      create      app/views/users/show.html.erb
      create      app/views/users/new.html.erb
      create      app/views/users/_form.html.erb
      invoke    test_unit
      create      test/controllers/users_controller_test.rb
      invoke    helper
      create      app/helpers/users_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      create      app/views/users/_user.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/users.coffee
      invoke    scss
      create      app/assets/stylesheets/users.scss
      invoke  scss
   identical    app/assets/stylesheets/scaffolds.scss

To user should be associated each post that user will create:

rails generate scaffold Micropost content:string user_id:integer
Running via Spring preloader in process 10518
      invoke  active_record
      create    db/migrate/20161121004208_create_microposts.rb
      create    app/models/micropost.rb
      invoke    test_unit
      create      test/models/micropost_test.rb
      create      test/fixtures/microposts.yml
      invoke  resource_route
       route    resources :microposts
      invoke  scaffold_controller
      create    app/controllers/microposts_controller.rb
      invoke    erb
      create      app/views/microposts
      create      app/views/microposts/index.html.erb
      create      app/views/microposts/edit.html.erb
      create      app/views/microposts/show.html.erb
      create      app/views/microposts/new.html.erb
      create      app/views/microposts/_form.html.erb
      invoke    test_unit
      create      test/controllers/microposts_controller_test.rb
      invoke    helper
      create      app/helpers/microposts_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/microposts/index.json.jbuilder
      create      app/views/microposts/show.json.jbuilder
      create      app/views/microposts/_micropost.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/microposts.coffee
      invoke    scss
      create      app/assets/stylesheets/microposts.scss
      invoke  scss
   identical    app/assets/stylesheets/scaffolds.scss

So, for now, we should have scaffold application with:

  • comments
  • post
  • users
  • and adding each of them to database.

Reference:

  1. Scaffold (programming) - Wikipedia
  2. MVC - Wikipedia