Ruby on Rails: Rails 3

Ruby on Rails 3:

  • rails new app - creates new app
  • rails server - starts new server
  • rails generate controller home index list - generate controller "home" +views: index and list
  • rake db:create - creates DB for already existing rails structure as per file config/database.yml (default is sqlite3)
  • rails generate scaffold [Name] [item:type] [item:type] ... [item:type] - generates scaffolding (Name) with particular items (e.g. title:string)
  • rails generate model [Name] [item:type] [item:type] ... - generates models
  • rails console - opens rails console (very useful)
  • rails dbconsole - opens rails database console (very useful)
  • rake routes - lists all routes (see also http://guides.rubyonrails.org/routing.html)

Creating new project - with execjs and therubyracer: (+controllers)

rails new app
cd app
cat Gemfile | awk "BEGIN {NL=0} {if (NL==4) print \"gem 'execjs'\ngem 'therubyracer'\n\"; print \$0; NL+=1 }" | cat > temp.$$$
mv temp.$$$ Gemfile
rails generate controller home index list # this create controllers home and views: index and list

Making redirection to home:index

rm public/index.html
vi config/routes.rb # add line: root :to => 'home#index'

Creating scaffolding...

rails generate scaffold Post name:string title:string content:text

Before scaffolding:
.
├── app
│   ├── assets
│   │   ├── images
│   │   │   └── rails.png
│   │   ├── javascripts
│   │   │   ├── application.js
│   │   │   └── home.js.coffee
│   │   └── stylesheets
│   │       ├── application.css
│   │       └── home.css.scss
│   │
│   │
│   │
│   ├── controllers
│   │   ├── application_controller.rb
│   │   └── home_controller.rb
│   │
│   │
│   ├── helpers
│   │   ├── application_helper.rb
│   │   └── home_helper.rb
│   ├── mailers
│   ├── models
│   │
│   └── views
│       ├── home
│       │   ├── index.html.erb
│       │   └── list.html.erb
│       └── layouts
│           └── application.html.erb
│
│
│
│
│
│
├── config
│   ├── application.rb
│   ├── boot.rb
│   ├── database.yml
│   ├── environment.rb
│   ├── environments
│   │   ├── development.rb
│   │   ├── production.rb
│   │   └── test.rb
│   ├── initializers
│   │   ├── backtrace_silencers.rb
│   │   ├── inflections.rb
│   │   ├── mime_types.rb
│   │   ├── secret_token.rb
│   │   ├── session_store.rb
│   │   └── wrap_parameters.rb
│   ├── locales
│   │   └── en.yml
│   └── routes.rb
├── config.ru
├── db
│   ├── development.sqlite3
│   │
│   │
│   └── seeds.rb
├── doc
│   └── README_FOR_APP
├── Gemfile
├── Gemfile.lock
├── lib
│   ├── assets
│   └── tasks
├── log
│   └── development.log
├── out.txt
├── public
│   ├── 404.html
│   ├── 422.html
│   ├── 500.html
│   ├── favicon.ico
│   └── robots.txt
├── Rakefile
├── README
├── script
│   └── rails
├── test
│   ├── fixtures
│   │
│   ├── functional
│   │   └── home_controller_test.rb
│   │
│   ├── integration
│   ├── performance
│   │   └── browsing_test.rb
│   ├── test_helper.rb
│   └── unit
│       └── helpers
│           └── home_helper_test.rb
│
│
├── tmp (not shown)
└── vendor
    ├── assets
    │   └── stylesheets
    └── plugins
68 directories, 62 files
After scaffolding:
.
├── app
│   ├── assets
│   │   ├── images
│   │   │   └── rails.png
│   │   ├── javascripts
│   │   │   ├── application.js
│   │   │   ├── home.js.coffee
│   │   │   └── posts.js.coffee
│   │   └── stylesheets
│   │       ├── application.css
│   │       ├── home.css.scss
│   │       ├── posts.css.scss
│   │       └── scaffolds.css.scss
│   ├── controllers
│   │   ├── application_controller.rb
│   │   ├── home_controller.rb
│   │   └── posts_controller.rb
│   ├── helpers
│   │   ├── application_helper.rb
│   │   ├── home_helper.rb
│   │   └── posts_helper.rb
│   ├── mailers
│   ├── models
│   │   └── post.rb
│   └── views
│       ├── home
│       │   ├── index.html.erb
│       │   └── list.html.erb
│       ├── layouts
│       │   └── application.html.erb
│       └── posts
│           ├── edit.html.erb
│           ├── _form.html.erb
│           ├── index.html.erb
│           ├── new.html.erb
│           └── show.html.erb
├── config
│   ├── application.rb
│   ├── boot.rb
│   ├── database.yml
│   ├── environment.rb
│   ├── environments
│   │   ├── development.rb
│   │   ├── production.rb
│   │   └── test.rb
│   ├── initializers
│   │   ├── backtrace_silencers.rb
│   │   ├── inflections.rb
│   │   ├── mime_types.rb
│   │   ├── secret_token.rb
│   │   ├── session_store.rb
│   │   └── wrap_parameters.rb
│   ├── locales
│   │   └── en.yml
│   └── routes.rb
├── config.ru
├── db
│   ├── development.sqlite3
│   ├── migrate
│   │   └── 20111103195912_create_posts.rb
│   └── seeds.rb
├── doc
│   └── README_FOR_APP
├── Gemfile
├── Gemfile.lock
├── lib
│   ├── assets
│   └── tasks
├── log
│   └── development.log
├── out.txt
├── public
│   ├── 404.html
│   ├── 422.html
│   ├── 500.html
│   ├── favicon.ico
│   └── robots.txt
├── Rakefile
├── README
├── script
│   └── rails
├── test
│   ├── fixtures
│   │   └── posts.yml
│   ├── functional
│   │   ├── home_controller_test.rb
│   │   └── posts_controller_test.rb
│   ├── integration
│   ├── performance
│   │   └── browsing_test.rb
│   ├── test_helper.rb
│   └── unit
│       ├── helpers
│       │   ├── home_helper_test.rb
│       │   └── posts_helper_test.rb
│       └── post_test.rb
├── tmp (not shown)
└── vendor
    ├── assets
    │   └── stylesheets
    └── plugins
70 directories, 78 files

Results: posts.js.coffee

# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http:// jashkenas.github.com/coffee-script/</a>

20111103195912_create_posts.rb file:

class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.string :name
      t.string :title
      t.text :content
 
      t.timestamps
    end
  end
end

Results:
posts_controller.rb

class PostsController < ApplicationController
  # GET /posts
  # GET /posts.json
  def index
    @posts = Post.all
 
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @posts }
    end
  end
 
  # GET /posts/1
  # GET /posts/1.json
  def show
    @post = Post.find(params[:id])
 
    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @post }
    end
  end
 
  # GET /posts/new
  # GET /posts/new.json
  def new
    @post = Post.new
 
    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @post }
    end
  end
  # GET /posts/1/edit
  def edit
    @post = Post.find(params[:id])
  end
 
  # POST /posts
  # POST /posts.json
  def create
    @post = Post.new(params[:post])
 
    respond_to do |format|
      if @post.save
        format.html { redirect_to @post, notice: 'Post was successfully created.' }
        format.json { render json: @post, status: :created, location: @post }
      else
        format.html { render action: "new" }
        format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end
 
  # PUT /posts/1
  # PUT /posts/1.json
  def update
    @post = Post.find(params[:id])
 
    respond_to do |format|
      if @post.update_attributes(params[:post])
        format.html { redirect_to @post, notice: 'Post was successfully updated.' }
        format.json { head :ok }
      else
        format.html { render action: "edit" }
        format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end
  # DELETE /posts/1
  # DELETE /posts/1.json
  def destroy
    @post = Post.find(params[:id])
    @post.destroy
 
    respond_to do |format|
      format.html { redirect_to posts_url }
      format.json { head :ok }
    end
  end
end

Processing next stuff

rake db:migrate # runs DB migration