SlideShare a Scribd company logo
Migrations                                                                                                           1 of 10



To Create a Blank Migration: rails g migration <name>
To Add Columns: rails g migration Add<Anything>To<TableName> [columnName:type]
To Remove Columns: rails g migration Remove<Anything>From<TableName> [columnName:type]



Column Options                          Migration Methods*                        Active Record Supported Types
 default:           <value>              create_table         change_table         :primary_key         :string
 limit:             30                   drop_table           add_column           :text                :integer
 null:              false                change_column        rename_column        :float               :decimal
 first:             true                 remove_column        add_index            :datetime            :timestamp
 after:             :email               remove_index                              :time                :date
 unique:            true                                                           :binary              :boolean

                                         * See documentation for syntax


Remove Column                                                 Add Column
 rails g migration RemoveAgeFromZombies age:integer            rails g migration AddEmailToZombies email:string


 class RemoveAgeFromZombies < ActiveRecord::Migration          class AddEmailToZombies < ActiveRecord::Migration
   def up                                                        def up
     remove_column :zombies, :age                                  add_column :zombies, :email, :string
   end                                                           end
   def down                                                      def down
     add_column :zombies, :age, :integer                           remove_column :zombies, :email
   end                                                           end
 end                                                           end


Create Table                                                                      Don’t Forget to Rake!
 rails g migration CreateZombiesTable name:string, bio:text, age:integer           $ rake db:migrate
                                                                                   Run all missing migrations
 class CreateZombiesTable < ActiveRecord::Migration
                                                                                   $ rake db:rollback
   def up
                                                                                   Rollback the previous migration
     create_table :zombies do |t|
       t.string :name                                                              $ rake db:setup
       t.text :bio                                                                 Create db, load schema & seed
       t.integer :age
                                                                                   $ rake db:schema:dump
       t.timestamps
                                                                                   Dump the current db state
     end
   end
                                                                                              db/schema.rb
   def down
     drop_table :zombies
   end
 end


Resources:
http://guides.rubyonrails.org/migrations.html
Rails Command Line                                                                                                 2 of 10




Command                Shortcut        Description
 rails new <app name>			                 # creates a new Rails application

 rails server		          rails s		       # starts up the Rails server

 rails generate		        rails g		       # generates template code
                                                                                     Help:
 rails console		         rails c		       # starts up the Rails console               All commands can be run with -h
                                                                                     for more information
 rails dbconsole		       rails db	       # starts up the Rails db console


Generate Examples
 rails g scaffold zombie name:string bio:text age:integer

 rails g migration RemoveEmailFromUser email:string

 rails g mailer ZombieMailer decomp_change lost_brain




Models
Named Scope                                                   Examples
 class Zombie < ActiveRecord::Base                              Zombie.rotting
   scope :rotting, where(rotting: true)                         Zombie.fresh
   scope :fresh, where(“age < 20”)                              Zombie.recent
   scope :recent, order(“created_at desc”).limit(3)             Zombie.rotting.recent
 end


Callbacks                                         Examples
 before_validation        after_validation            after_create :send_welcome_email
 before_save              after_save                  before_save :encrypt_password
 before_create            after_create                before_destroy :set_deleted_flag
 before_update            after_update                after_update {|zombie| logger.info “Zombie #{zombie.id} updated” }
 before_destroy           after_destroy


Self Scope                                                    Relationship Options
Reading attributes does not require “self ” but setting
                                                                dependent: :destroy
attributes does require “self ”
                                                                foreign_key: :undead_id
                                                                primary_key: :zid
                                                                validate: true
 class Zombie < ActiveRecord::Base
   before_save :make_rotting
   def make_rotting                                           Relational Includes Examples*
     if age > 20
       self.rotting = true                                      @zombies = Zombie.includes(:brain).all
     end                                                        @recent = Zombie.recent.includes(:brain)
   end
                                                               * To avoid extra queries
 end
REST & Routes                                                                                                        3 of 10




Rake Routes                       Generates
 $ rake routes                     zombies       GET /zombies              {:action=>”index”, :controller=>”zombies”}
                                                 POST /zombies             {:action=>”create”, :controller=>”zombies”}
- Prints your RESTful routes       new_zombie    GET /zombies/new          {:action=>”new”, :controller=>”zombies”}
                                   edit_zombie   GET /zombies/:id/edit     {:action=>”edit”, :controller=>”zombies”}
                                   zombie        GET /zombies/:id          {:action=>”show”, :controller=>”zombies”}
                                                 PUT /zombies/:id          {:action=>”update”, :controller=>”zombies”}
                                                 DELETE /zombies/:id       {:action=>”destroy”, :controller=>”zombies”}


Example Link To Usage                                           Relative Paths       Path Generated
 <%=   link_to   'All Zombies', zombies_path %>                  zombies_path        /zombies
 <%=   link_to   'New Zombie', new_zombie_path %>                new_zombie_path     /zombies/new
 <%=   link_to   'Edit Zombie', edit_zombie_path(@zombie) %>
 <%=   link_to   'Show Zombie', zombie_path(@zombie) %>         Absolute Paths       URL Generated
 <%=   link_to   'Show Zombie', @zombie %>
 <%=   link_to   'Delete Zombie', @zombie, method :delete %>     zombies_url         http://localhost:3000/zombies
                                                                 new_zombie_url      http://localhost:3000/zombies/new




Forms
Example                                                                            Alternate Text Input Helpers
 <%= form_for(@zombie) do |f| %>                                                     <%=   f.password_field :password %>
   <%= f.text_field :name %>                                                         <%=   f.number_field :price %>
   <%= f.text_area :bio %>                                                           <%=   f.range_field :quantity %>
                                                                                     <%=   f.email_field :email %>
   <%= f.select :decomp, ['fresh', 'rotting', 'stale'] %>                            <%=   f.url_field :website %>
   <%= f.select :decomp, [['fresh', 1], ['rotting', 2], ['stale', 3]] %>             <%=   f.telephone_field :mobile %>

   <%= f.radio_button :decomp, 'fresh', checked: true %>
   <%= f.radio_button :decomp, 'rotting' %>
   <%= f.radio_button :decomp, 'stale' %>

   <%= f.check_box :rotting %>

   <%= f.submit %>
 <% end %>
Nested Routes                                                                                              4 of 10




1   app/configure/routes.rb
     TwitterForZombies::Application.routes.draw do
       resources :zombies do
         resources :tweets
       end
     end




2   app/controller/tweets_controller.rb
     class TweetsController < ApplicationController
       before_filter :get_zombie

       def get_zombie
         @zombie = Zombie.find(params[:zombie_id])
       end

       def show
                                                                  /zombies/4/tweets/2
         @tweet = @zombie.tweets.find(params[:id])
                                                                  params = { :zombie_id => 4, :id => 2 }
       end

       def create
         @tweet = @zombie.tweets.new(params[:tweet])
         if @tweet.save
           redirect_to [@zombie, @tweet]
         else
           render action: “new”
       end

       def index
                                                                  /zombies/4/tweets
         @tweets = @zombie.tweets
                                                                  params = { :zombie_id => 4 }
       end
     end




3   app/views/tweets/_form.html.erb
     <%= form_for([@zombie, @tweet]) do |f| %>




4   app/views/tweets/index.html.erb
     <% @tweets.each do |tweet| %>
       <tr>
                                                                                     Look Up URL Helpers
                                                                                      $ rake routes

         <td><%= tweet.body %></td>
         <td><%= link_to ‘Show’, [@zombie, tweet] %></td>
         <td><%= link_to ‘Edit’, edit_zombie_tweet_path(@zombie, tweet) %></td>
         <td><%= link_to ‘Destroy’, [@zombie, tweet], method: :delete %></td>
       </tr>
     <% end %>

     <%= link_to ‘New Tweet’, new_zombie_tweet_path(@zombie) %>
View Partials & View Helpers                                                                                               5 of 10




app/views/tweets/new.html.erb
 <h1>New tweet</h1>
 <%= render 'form' %>                                         app/views/tweets/_form.html.erb
 <%= link_to 'Back', zombie_tweets_path(@zombie) %>
                                                               <h1>New tweet</h1>
                                                               <%= render 'form' %>
app/views/tweets/edit.html.erb
                                                               <%= link_to 'Back', zombie_tweets_path(@zombie) %>
 <h1>Editing tweet</h1>
 <%= render 'form' %>                                          - Partials start with an underscore




View Helper                                              Same As                          Calls
 <div id="tweet_<%= tweet.id %>" class="tweet">       <%= div_for tweet do %>           dom_id(@tweet)    ->   #tweet_2
   <%= tweet.body %>                                    <%= tweet.body %>
 </div>                                               <% end %>


View Helper                                              Same As                          Looks For
 <%= @zombies.each do |zombie| %>                     <%= render @zombies %>            views/zombies/_zombie.html.erb
   <%= render zombie %>
 <% end %>




Additional Helpers                                                                 Result
 <%= truncate("I need brains!", :length => 10) %>                                   I need bra…


 <%= truncate("I need brains!", :length => 10, :separator => ' ') %>                I need…


 I see <%= pluralize(Zombie.count, "zombie") %>                                     I see 2 zombies / I see 1 zombie


 His name was <%= @zombie.name.titleize %>                                          His name was Ash Williams


 Ash’s zombie roles are <%= @role_names.to_sentence %>                              Ash’s zombie roles are Captain, and Solidier.


 He was buried alive <%= time_ago_in_words @zombie.created_at %> ago                He was buried alive 2 days ago


 Price is <%= number_to_currency 13.5 %>                                            Price is $13.50


 Ash is <%= number_to_human 13234355423 %> years old %>                             Ash is 13.2 billion years old
Creating a Mailer                                                                                                6 of 10



Generator: rails g mailer ZombieMailer decomp_change lost_brain


Mailer Class Example -    app/mailers/zombie_mailer.rb                     Additional Options
 class ZombieMailer < ActionMailer::Base                                    from: my@email.com
   default from: "from@example.com"                                         cc: my@email.com
                                                                            bcc: my@email.com
   def decomp_change(zombie)                                                reply_to: my@email.com
     @zombie = zombie
     @last_tweet = @zombie.tweets.last                                     Mass Mailing Notes:
                                                                           Mass mailing is best done outside of
     attachments['z.pdf'] = File.read("#{Rails.root}/public/zombie.pdf")
                                                                           Rails. You can use gems for services
     mail to: @zombie.email, subject: 'Your decomp stage has changed'
                                                                           like MadMimi.com if you plan on
   end
                                                                           sending a lot of mail.
 end


Mailer Text Views -   app/views/zombie_mailer/decomp_change.text.erb       Resources:
                                                                           http://guides.rubyonrails.org/action_
 Greetings <%= @zombie.name %>                                             mailer_basics.html

Mailer HTML Views -     app/views/zombie_mailer/decomp_change.html.erb

 <h1>Greetings <%= @zombie.name %></h1>


Sending Mail -   app/models/zombie.rb

 ZombieMailer.decomp_change(@zombie).deliver




Assets & Asset Paths
Asset Tag Helpers
 <%= javascript_include_tag "custom" %>


 <%= stylesheet_link_tag "style" %>


 <%= image_tag "rails.png" %>


Asset Paths in Stylesheets -     app/assets/stylesheets/zombie.css.erb

 form.new_zombie input.submit {
   background-image: url(<%= asset_path('button.png') %>);
 }


Using SASS, CoffeeScript Assets
To compile with other CSS/JS helpers, just add the necessary extension.
                                                                           Resources:
                                                                           http://sass-lang.org
 app/assets/stylesheets/zombie.css.scss.erb
                                                                           http://jashkenas.github.com/coffee-script/
 app/assets/javascripts/zombies.js.coffee
CoffeeScript & jQuery                                                                                                       7 of 10




JavaScript & jQuery                                       CoffeeScript & jQuery
app/assets/javascripts/zombie.js                          app/assets/javascripts/zombie.js.coffee

 $(document).ready(function() {                          $(document).ready ->
   $('#show-bio').click(function(event) {                  $('#show-bio').click (event) ->
     event.preventDefault();                                 event.preventDefault()
     $(this).hide();                                         $(this).hide()
     $('.field#bio').show();                                 $('.field#bio').show()
   }
 }


CoffeeScript AJAX Example
 $(document).ready ->
   $('div#custom_phase2 form').submit (event) ->
     event.preventDefault()
     url = $(this).attr('action')
     custom_decomp = $('div#custom_phase2 #zombie_decomp').val()

       $.ajax
         type: 'put'
         url: url
         data: { zombie: { decomp: custom_decomp } }
         dataType: 'json'
         success: (json) ->
           $('#decomp').text(json.decomp).effect('highlight')
           $('div#custom_phase2').fadeOut() if json.decomp == "Dead (again)"




SASS & CSS
CSS                                                                 SASS
app/assets/stylesheets/zombie.css.erb                               app/assets/stylesheets/zombie.css.scss.erb

 form.new_zombie {                                                 form.new_zombie {
   border: 1px dashed gray;                                          border: 1px dashed gray;
 }
                                                                       .field#bio {
 form.new_zombie .field#bio {                                            display: none;
   display: none;                                                      }
 }
                                                                       input.submit {
 form.new_zombie input.submit {                                            background-image: url(<%= asset_path('button.png') %>);
     background-image: url(<%= asset_path('button.png') %>);           }
 }                                                                 }



To Remove SASS/CoffeeScript Default Asset Generation
             Gemfile

              gem 'sass-rails'
Remove                                       then rerun 'bundle install'
              gem 'coffee-script'
Sprockets & Application.js/.css                                                                                              8 of 10




app/assets/javascripts/application.js
Contains a manifest of the JavaScript files we use


 //= require jquery                                            Looks for jquery.js in all asset paths
 //= require jquery_ujs

 //= require shared                                            Loads: lib/assets/javascripts/shared.js.coffee

 //= require_tree .




app/assets/stylesheet/application.css
Contains a manifest of the stylesheets we use


 /*
  *= require reset
  *= require_self                                              Styles in this file are included after the reset stylesheet
  *= require_tree .
  */

 form.new_zombie {
   border: 1px dashed gray;
 }




Rendering / HTTP Status Codes
Responds_to Example
app/controllers/zombies_controller.rb

 class ZombiesController < ApplicationController
   def show
     @zombie = Zombie.find(params[:id])
     respond_to do |format|
       format.html do
         if @zombie.decomp == 'Dead (again)'
            render :dead_again                                 Renders app/views/zombies/dead_again.html.erb
         end
                                                               Renders app/views/zombies/show.html.erb
       end
       format.json { render json: @zombie }                    Renders JSON
     end
   end
 end


HTTP Status Codes                                  JSON Rendering Examples
 200 :ok                   401 :unauthorized         render json: @zombie.errors, status: :unprocessable_entity
 201 :created              102 :processing           render json: @zombie, status: :created, location: @zombie
 422 :unprocessed_entity   404 :not_found
Custom Routes                                                                                                     9 of 10




Types                                   Route                                     URL
 :member                                 get :decomp, on: :member                  /zombies/:id/decomp
 acts on a single resource
                                         put :decay, on: :member                   /zombies/:id/decay
 :collection
 acts on a collection of resources
                                         get :fresh, on: :collection               /zombies/fresh


                                         post :search, on: :collection             /zombies/search


                                        Examples
                                         <%=   link_to 'Fresh zombies', fresh_zombies_path %>
                                         <%=   form_tag(search_zombies_path) do |f| %>
                                         <%=   link_to 'Get decomp', decomp_zombie_path(@zombie) %>
                                         <%=   form_for @zombie, url: decay_zombie_path(@zombie) %>




Custom JSON Responses
Examples
 @zombie.to_json(only: :name)            @zombie.to_json(except: [:created_at, :updated_at, :id, :email, :bio])


 { “name” : “Eric” }                     { "age":25, "decomp":"Fresh", "name":"Eric", "rotting":false }




 @zombie.to_json(only: [:name, :age])    @zombie.to_json(include: :brain, except: [:created_at, :updated_at, :id])


 { “name” : “Eric”, "age": 25 }          {
                                             "age":25,
                                             "bio":"I am zombified",
                                             "decomp":"Fresh",
                                             "email":"zom@bied.com",
                                             "name":"Eric",
                                             "rotting":false,
                                             "brain": { "flavor":"Butter", "status":"Smashed", "zombie_id":3 }
                                         }
AJAX                                                                                          10 of 10




1   Make a Remote Link or Form Call
     <%= link_to 'delete', zombie, method: :delete, remote: true %>


     <a href="/zombies/5" data-method="delete" data-remote="true" rel="nofollow">delete</a>



     <%= form_for (@zombie, remote: true) do |f| %>


     <form action="/zombies" data-remote="true" method="post">




2   Ensure the Controller Can Accept JavaScript Calls
     respond_to do |format|
       format.js
     end




3   Write the JavaScript to Return to the Client
    app/views/zombies/<action name>.js.erb


     $('#<%= dom_id(@zombie) %>').fadeOut();



    Other jQuery Actions
     $('<selector>').append(<content or jQuery object>);
     $('<selector>').effect('highlight');                         Requires jQuery UI
     $('<selector>').text(<string>);

More Related Content

What's hot (20)

PDF
Ruby on Rails Presentation
adamcookeuk
 
PDF
Ruby and Rails by example
bryanbibat
 
PDF
Rails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
Raimonds Simanovskis
 
PDF
The Enterprise Strikes Back
Burke Libbey
 
PDF
A Few of My Favorite (Python) Things
Michael Pirnat
 
KEY
A tour on ruby and friends
旻琦 潘
 
PDF
Rails on Oracle 2011
Raimonds Simanovskis
 
PDF
Connecting the Worlds of Java and Ruby with JRuby
Nick Sieger
 
PDF
JRuby and You
Hiro Asari
 
PDF
JS Level Up: Prototypes
Vernon Kesner
 
PDF
TYPO3 Flow 2.0 Workshop T3BOARD13
Robert Lemke
 
KEY
Minicurso Ruby e Rails
SEA Tecnologia
 
PDF
Spring into rails
Hiro Asari
 
PPTX
Chef on MongoDB and Pyramid
Rick Copeland
 
KEY
Cassandra Client Tutorial
Joe McTee
 
PDF
Using Java from Ruby with JRuby IRB
Hiro Asari
 
KEY
Ruby/Rails
rstankov
 
PDF
JavaScript - From Birth To Closure
Robert Nyman
 
KEY
Why ruby
rstankov
 
PDF
Coffee Script
Michal Taberski
 
Ruby on Rails Presentation
adamcookeuk
 
Ruby and Rails by example
bryanbibat
 
Rails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
Raimonds Simanovskis
 
The Enterprise Strikes Back
Burke Libbey
 
A Few of My Favorite (Python) Things
Michael Pirnat
 
A tour on ruby and friends
旻琦 潘
 
Rails on Oracle 2011
Raimonds Simanovskis
 
Connecting the Worlds of Java and Ruby with JRuby
Nick Sieger
 
JRuby and You
Hiro Asari
 
JS Level Up: Prototypes
Vernon Kesner
 
TYPO3 Flow 2.0 Workshop T3BOARD13
Robert Lemke
 
Minicurso Ruby e Rails
SEA Tecnologia
 
Spring into rails
Hiro Asari
 
Chef on MongoDB and Pyramid
Rick Copeland
 
Cassandra Client Tutorial
Joe McTee
 
Using Java from Ruby with JRuby IRB
Hiro Asari
 
Ruby/Rails
rstankov
 
JavaScript - From Birth To Closure
Robert Nyman
 
Why ruby
rstankov
 
Coffee Script
Michal Taberski
 

Similar to Rails for zombies_2_cheatsheets (20)

KEY
Rails Model Basics
James Gray
 
PDF
Where's My SQL? Designing Databases with ActiveRecord Migrations
Eleanor McHugh
 
KEY
Rails Database Migration, Season 2
RORLAB
 
PDF
rails-migrations_1
brecke
 
PDF
Rails DB migrations
Denys Kurets
 
PDF
Ruby on Rails - Introduction
Vagmi Mudumbai
 
DOCX
Ruby on Rails
Sadakathullah Appa College
 
KEY
Desarrollando aplicaciones web en minutos
Edgar Suarez
 
PDF
Rails Tips and Best Practices
David Keener
 
PDF
浜松Rails3道場 其の弐 Model編
Masakuni Kato
 
PDF
Rails data migrations
Andrei Kaleshka
 
PDF
Zero downtime deploys for Rails apps
pedrobelo
 
ZIP
Rails 3 (beta) Roundup
Wayne Carter
 
PPTX
12 Introduction to Rails
Deepak Hagadur Bheemaraju
 
PDF
td_mxc_rubyrails_shin
tutorialsruby
 
PDF
td_mxc_rubyrails_shin
tutorialsruby
 
PDF
Ruby is Awesome
Astrails
 
PDF
acts_asを使ってみよう
xibbar
 
PDF
Ruby on Rails in UbiSunrise
Wisely chen
 
PDF
Rails 3 Beautiful Code
GreggPollack
 
Rails Model Basics
James Gray
 
Where's My SQL? Designing Databases with ActiveRecord Migrations
Eleanor McHugh
 
Rails Database Migration, Season 2
RORLAB
 
rails-migrations_1
brecke
 
Rails DB migrations
Denys Kurets
 
Ruby on Rails - Introduction
Vagmi Mudumbai
 
Desarrollando aplicaciones web en minutos
Edgar Suarez
 
Rails Tips and Best Practices
David Keener
 
浜松Rails3道場 其の弐 Model編
Masakuni Kato
 
Rails data migrations
Andrei Kaleshka
 
Zero downtime deploys for Rails apps
pedrobelo
 
Rails 3 (beta) Roundup
Wayne Carter
 
12 Introduction to Rails
Deepak Hagadur Bheemaraju
 
td_mxc_rubyrails_shin
tutorialsruby
 
td_mxc_rubyrails_shin
tutorialsruby
 
Ruby is Awesome
Astrails
 
acts_asを使ってみよう
xibbar
 
Ruby on Rails in UbiSunrise
Wisely chen
 
Rails 3 Beautiful Code
GreggPollack
 
Ad

Recently uploaded (20)

PDF
Week 2 - Irish Natural Heritage Powerpoint.pdf
swainealan
 
PPTX
How to Create a Customer From Website in Odoo 18.pptx
Celine George
 
PPTX
HUMAN RESOURCE MANAGEMENT: RECRUITMENT, SELECTION, PLACEMENT, DEPLOYMENT, TRA...
PRADEEP ABOTHU
 
PDF
Vani - The Voice of Excellence - Jul 2025 issue
Savipriya Raghavendra
 
PPTX
How to Manage Allocation Report for Manufacturing Orders in Odoo 18
Celine George
 
PDF
Council of Chalcedon Re-Examined
Smiling Lungs
 
PDF
Android Programming - Basics of Mobile App, App tools and Android Basics
Kavitha P.V
 
PPTX
AIMA UCSC-SV Leadership_in_the_AI_era 20250628 v16.pptx
home
 
PPTX
SD_GMRC5_Session 6AB_Dulog Pedagohikal at Pagtataya (1).pptx
NickeyArguelles
 
PPTX
infertility, types,causes, impact, and management
Ritu480198
 
PPTX
Identifying elements in the story. Arrange the events in the story
geraldineamahido2
 
PPTX
Nitrogen rule, ring rule, mc lafferty.pptx
nbisen2001
 
PPTX
Building Powerful Agentic AI with Google ADK, MCP, RAG, and Ollama.pptx
Tamanna36
 
PPTX
Controller Request and Response in Odoo18
Celine George
 
PPTX
Marketing Management PPT Unit 1 and Unit 2.pptx
Sri Ramakrishna College of Arts and science
 
PPTX
How to Send Email From Odoo 18 Website - Odoo Slides
Celine George
 
PDF
WATERSHED MANAGEMENT CASE STUDIES - ULUGURU MOUNTAINS AND ARVARI RIVERpdf
Ar.Asna
 
PPTX
Lesson 1 Cell (Structures, Functions, and Theory).pptx
marvinnbustamante1
 
PPTX
PLANNING FOR EMERGENCY AND DISASTER MANAGEMENT ppt.pptx
PRADEEP ABOTHU
 
PPTX
EDUCATIONAL MEDIA/ TEACHING AUDIO VISUAL AIDS
Sonali Gupta
 
Week 2 - Irish Natural Heritage Powerpoint.pdf
swainealan
 
How to Create a Customer From Website in Odoo 18.pptx
Celine George
 
HUMAN RESOURCE MANAGEMENT: RECRUITMENT, SELECTION, PLACEMENT, DEPLOYMENT, TRA...
PRADEEP ABOTHU
 
Vani - The Voice of Excellence - Jul 2025 issue
Savipriya Raghavendra
 
How to Manage Allocation Report for Manufacturing Orders in Odoo 18
Celine George
 
Council of Chalcedon Re-Examined
Smiling Lungs
 
Android Programming - Basics of Mobile App, App tools and Android Basics
Kavitha P.V
 
AIMA UCSC-SV Leadership_in_the_AI_era 20250628 v16.pptx
home
 
SD_GMRC5_Session 6AB_Dulog Pedagohikal at Pagtataya (1).pptx
NickeyArguelles
 
infertility, types,causes, impact, and management
Ritu480198
 
Identifying elements in the story. Arrange the events in the story
geraldineamahido2
 
Nitrogen rule, ring rule, mc lafferty.pptx
nbisen2001
 
Building Powerful Agentic AI with Google ADK, MCP, RAG, and Ollama.pptx
Tamanna36
 
Controller Request and Response in Odoo18
Celine George
 
Marketing Management PPT Unit 1 and Unit 2.pptx
Sri Ramakrishna College of Arts and science
 
How to Send Email From Odoo 18 Website - Odoo Slides
Celine George
 
WATERSHED MANAGEMENT CASE STUDIES - ULUGURU MOUNTAINS AND ARVARI RIVERpdf
Ar.Asna
 
Lesson 1 Cell (Structures, Functions, and Theory).pptx
marvinnbustamante1
 
PLANNING FOR EMERGENCY AND DISASTER MANAGEMENT ppt.pptx
PRADEEP ABOTHU
 
EDUCATIONAL MEDIA/ TEACHING AUDIO VISUAL AIDS
Sonali Gupta
 
Ad

Rails for zombies_2_cheatsheets

  • 1. Migrations 1 of 10 To Create a Blank Migration: rails g migration <name> To Add Columns: rails g migration Add<Anything>To<TableName> [columnName:type] To Remove Columns: rails g migration Remove<Anything>From<TableName> [columnName:type] Column Options Migration Methods* Active Record Supported Types default: <value> create_table change_table :primary_key :string limit: 30 drop_table add_column :text :integer null: false change_column rename_column :float :decimal first: true remove_column add_index :datetime :timestamp after: :email remove_index :time :date unique: true :binary :boolean * See documentation for syntax Remove Column Add Column rails g migration RemoveAgeFromZombies age:integer rails g migration AddEmailToZombies email:string class RemoveAgeFromZombies < ActiveRecord::Migration class AddEmailToZombies < ActiveRecord::Migration def up def up remove_column :zombies, :age add_column :zombies, :email, :string end end def down def down add_column :zombies, :age, :integer remove_column :zombies, :email end end end end Create Table Don’t Forget to Rake! rails g migration CreateZombiesTable name:string, bio:text, age:integer $ rake db:migrate Run all missing migrations class CreateZombiesTable < ActiveRecord::Migration $ rake db:rollback def up Rollback the previous migration create_table :zombies do |t| t.string :name $ rake db:setup t.text :bio Create db, load schema & seed t.integer :age $ rake db:schema:dump t.timestamps Dump the current db state end end db/schema.rb def down drop_table :zombies end end Resources: http://guides.rubyonrails.org/migrations.html
  • 2. Rails Command Line 2 of 10 Command Shortcut Description rails new <app name> # creates a new Rails application rails server rails s # starts up the Rails server rails generate rails g # generates template code Help: rails console rails c # starts up the Rails console All commands can be run with -h for more information rails dbconsole rails db # starts up the Rails db console Generate Examples rails g scaffold zombie name:string bio:text age:integer rails g migration RemoveEmailFromUser email:string rails g mailer ZombieMailer decomp_change lost_brain Models Named Scope Examples class Zombie < ActiveRecord::Base Zombie.rotting scope :rotting, where(rotting: true) Zombie.fresh scope :fresh, where(“age < 20”) Zombie.recent scope :recent, order(“created_at desc”).limit(3) Zombie.rotting.recent end Callbacks Examples before_validation after_validation after_create :send_welcome_email before_save after_save before_save :encrypt_password before_create after_create before_destroy :set_deleted_flag before_update after_update after_update {|zombie| logger.info “Zombie #{zombie.id} updated” } before_destroy after_destroy Self Scope Relationship Options Reading attributes does not require “self ” but setting dependent: :destroy attributes does require “self ” foreign_key: :undead_id primary_key: :zid validate: true class Zombie < ActiveRecord::Base before_save :make_rotting def make_rotting Relational Includes Examples* if age > 20 self.rotting = true @zombies = Zombie.includes(:brain).all end @recent = Zombie.recent.includes(:brain) end * To avoid extra queries end
  • 3. REST & Routes 3 of 10 Rake Routes Generates $ rake routes zombies GET /zombies {:action=>”index”, :controller=>”zombies”} POST /zombies {:action=>”create”, :controller=>”zombies”} - Prints your RESTful routes new_zombie GET /zombies/new {:action=>”new”, :controller=>”zombies”} edit_zombie GET /zombies/:id/edit {:action=>”edit”, :controller=>”zombies”} zombie GET /zombies/:id {:action=>”show”, :controller=>”zombies”} PUT /zombies/:id {:action=>”update”, :controller=>”zombies”} DELETE /zombies/:id {:action=>”destroy”, :controller=>”zombies”} Example Link To Usage Relative Paths Path Generated <%= link_to 'All Zombies', zombies_path %> zombies_path /zombies <%= link_to 'New Zombie', new_zombie_path %> new_zombie_path /zombies/new <%= link_to 'Edit Zombie', edit_zombie_path(@zombie) %> <%= link_to 'Show Zombie', zombie_path(@zombie) %> Absolute Paths URL Generated <%= link_to 'Show Zombie', @zombie %> <%= link_to 'Delete Zombie', @zombie, method :delete %> zombies_url http://localhost:3000/zombies new_zombie_url http://localhost:3000/zombies/new Forms Example Alternate Text Input Helpers <%= form_for(@zombie) do |f| %> <%= f.password_field :password %> <%= f.text_field :name %> <%= f.number_field :price %> <%= f.text_area :bio %> <%= f.range_field :quantity %> <%= f.email_field :email %> <%= f.select :decomp, ['fresh', 'rotting', 'stale'] %> <%= f.url_field :website %> <%= f.select :decomp, [['fresh', 1], ['rotting', 2], ['stale', 3]] %> <%= f.telephone_field :mobile %> <%= f.radio_button :decomp, 'fresh', checked: true %> <%= f.radio_button :decomp, 'rotting' %> <%= f.radio_button :decomp, 'stale' %> <%= f.check_box :rotting %> <%= f.submit %> <% end %>
  • 4. Nested Routes 4 of 10 1 app/configure/routes.rb TwitterForZombies::Application.routes.draw do resources :zombies do resources :tweets end end 2 app/controller/tweets_controller.rb class TweetsController < ApplicationController before_filter :get_zombie def get_zombie @zombie = Zombie.find(params[:zombie_id]) end def show /zombies/4/tweets/2 @tweet = @zombie.tweets.find(params[:id]) params = { :zombie_id => 4, :id => 2 } end def create @tweet = @zombie.tweets.new(params[:tweet]) if @tweet.save redirect_to [@zombie, @tweet] else render action: “new” end def index /zombies/4/tweets @tweets = @zombie.tweets params = { :zombie_id => 4 } end end 3 app/views/tweets/_form.html.erb <%= form_for([@zombie, @tweet]) do |f| %> 4 app/views/tweets/index.html.erb <% @tweets.each do |tweet| %> <tr> Look Up URL Helpers $ rake routes <td><%= tweet.body %></td> <td><%= link_to ‘Show’, [@zombie, tweet] %></td> <td><%= link_to ‘Edit’, edit_zombie_tweet_path(@zombie, tweet) %></td> <td><%= link_to ‘Destroy’, [@zombie, tweet], method: :delete %></td> </tr> <% end %> <%= link_to ‘New Tweet’, new_zombie_tweet_path(@zombie) %>
  • 5. View Partials & View Helpers 5 of 10 app/views/tweets/new.html.erb <h1>New tweet</h1> <%= render 'form' %> app/views/tweets/_form.html.erb <%= link_to 'Back', zombie_tweets_path(@zombie) %> <h1>New tweet</h1> <%= render 'form' %> app/views/tweets/edit.html.erb <%= link_to 'Back', zombie_tweets_path(@zombie) %> <h1>Editing tweet</h1> <%= render 'form' %> - Partials start with an underscore View Helper Same As Calls <div id="tweet_<%= tweet.id %>" class="tweet"> <%= div_for tweet do %> dom_id(@tweet) -> #tweet_2 <%= tweet.body %> <%= tweet.body %> </div> <% end %> View Helper Same As Looks For <%= @zombies.each do |zombie| %> <%= render @zombies %> views/zombies/_zombie.html.erb <%= render zombie %> <% end %> Additional Helpers Result <%= truncate("I need brains!", :length => 10) %> I need bra… <%= truncate("I need brains!", :length => 10, :separator => ' ') %> I need… I see <%= pluralize(Zombie.count, "zombie") %> I see 2 zombies / I see 1 zombie His name was <%= @zombie.name.titleize %> His name was Ash Williams Ash’s zombie roles are <%= @role_names.to_sentence %> Ash’s zombie roles are Captain, and Solidier. He was buried alive <%= time_ago_in_words @zombie.created_at %> ago He was buried alive 2 days ago Price is <%= number_to_currency 13.5 %> Price is $13.50 Ash is <%= number_to_human 13234355423 %> years old %> Ash is 13.2 billion years old
  • 6. Creating a Mailer 6 of 10 Generator: rails g mailer ZombieMailer decomp_change lost_brain Mailer Class Example - app/mailers/zombie_mailer.rb Additional Options class ZombieMailer < ActionMailer::Base from: [email protected] default from: "[email protected]" cc: [email protected] bcc: [email protected] def decomp_change(zombie) reply_to: [email protected] @zombie = zombie @last_tweet = @zombie.tweets.last Mass Mailing Notes: Mass mailing is best done outside of attachments['z.pdf'] = File.read("#{Rails.root}/public/zombie.pdf") Rails. You can use gems for services mail to: @zombie.email, subject: 'Your decomp stage has changed' like MadMimi.com if you plan on end sending a lot of mail. end Mailer Text Views - app/views/zombie_mailer/decomp_change.text.erb Resources: http://guides.rubyonrails.org/action_ Greetings <%= @zombie.name %> mailer_basics.html Mailer HTML Views - app/views/zombie_mailer/decomp_change.html.erb <h1>Greetings <%= @zombie.name %></h1> Sending Mail - app/models/zombie.rb ZombieMailer.decomp_change(@zombie).deliver Assets & Asset Paths Asset Tag Helpers <%= javascript_include_tag "custom" %> <%= stylesheet_link_tag "style" %> <%= image_tag "rails.png" %> Asset Paths in Stylesheets - app/assets/stylesheets/zombie.css.erb form.new_zombie input.submit { background-image: url(<%= asset_path('button.png') %>); } Using SASS, CoffeeScript Assets To compile with other CSS/JS helpers, just add the necessary extension. Resources: http://sass-lang.org app/assets/stylesheets/zombie.css.scss.erb http://jashkenas.github.com/coffee-script/ app/assets/javascripts/zombies.js.coffee
  • 7. CoffeeScript & jQuery 7 of 10 JavaScript & jQuery CoffeeScript & jQuery app/assets/javascripts/zombie.js app/assets/javascripts/zombie.js.coffee $(document).ready(function() { $(document).ready -> $('#show-bio').click(function(event) { $('#show-bio').click (event) -> event.preventDefault(); event.preventDefault() $(this).hide(); $(this).hide() $('.field#bio').show(); $('.field#bio').show() } } CoffeeScript AJAX Example $(document).ready -> $('div#custom_phase2 form').submit (event) -> event.preventDefault() url = $(this).attr('action') custom_decomp = $('div#custom_phase2 #zombie_decomp').val() $.ajax type: 'put' url: url data: { zombie: { decomp: custom_decomp } } dataType: 'json' success: (json) -> $('#decomp').text(json.decomp).effect('highlight') $('div#custom_phase2').fadeOut() if json.decomp == "Dead (again)" SASS & CSS CSS SASS app/assets/stylesheets/zombie.css.erb app/assets/stylesheets/zombie.css.scss.erb form.new_zombie { form.new_zombie { border: 1px dashed gray; border: 1px dashed gray; } .field#bio { form.new_zombie .field#bio { display: none; display: none; } } input.submit { form.new_zombie input.submit { background-image: url(<%= asset_path('button.png') %>); background-image: url(<%= asset_path('button.png') %>); } } } To Remove SASS/CoffeeScript Default Asset Generation Gemfile gem 'sass-rails' Remove then rerun 'bundle install' gem 'coffee-script'
  • 8. Sprockets & Application.js/.css 8 of 10 app/assets/javascripts/application.js Contains a manifest of the JavaScript files we use //= require jquery Looks for jquery.js in all asset paths //= require jquery_ujs //= require shared Loads: lib/assets/javascripts/shared.js.coffee //= require_tree . app/assets/stylesheet/application.css Contains a manifest of the stylesheets we use /* *= require reset *= require_self Styles in this file are included after the reset stylesheet *= require_tree . */ form.new_zombie { border: 1px dashed gray; } Rendering / HTTP Status Codes Responds_to Example app/controllers/zombies_controller.rb class ZombiesController < ApplicationController def show @zombie = Zombie.find(params[:id]) respond_to do |format| format.html do if @zombie.decomp == 'Dead (again)' render :dead_again Renders app/views/zombies/dead_again.html.erb end Renders app/views/zombies/show.html.erb end format.json { render json: @zombie } Renders JSON end end end HTTP Status Codes JSON Rendering Examples 200 :ok 401 :unauthorized render json: @zombie.errors, status: :unprocessable_entity 201 :created 102 :processing render json: @zombie, status: :created, location: @zombie 422 :unprocessed_entity 404 :not_found
  • 9. Custom Routes 9 of 10 Types Route URL :member get :decomp, on: :member /zombies/:id/decomp acts on a single resource put :decay, on: :member /zombies/:id/decay :collection acts on a collection of resources get :fresh, on: :collection /zombies/fresh post :search, on: :collection /zombies/search Examples <%= link_to 'Fresh zombies', fresh_zombies_path %> <%= form_tag(search_zombies_path) do |f| %> <%= link_to 'Get decomp', decomp_zombie_path(@zombie) %> <%= form_for @zombie, url: decay_zombie_path(@zombie) %> Custom JSON Responses Examples @zombie.to_json(only: :name) @zombie.to_json(except: [:created_at, :updated_at, :id, :email, :bio]) { “name” : “Eric” } { "age":25, "decomp":"Fresh", "name":"Eric", "rotting":false } @zombie.to_json(only: [:name, :age]) @zombie.to_json(include: :brain, except: [:created_at, :updated_at, :id]) { “name” : “Eric”, "age": 25 } { "age":25, "bio":"I am zombified", "decomp":"Fresh", "email":"[email protected]", "name":"Eric", "rotting":false, "brain": { "flavor":"Butter", "status":"Smashed", "zombie_id":3 } }
  • 10. AJAX 10 of 10 1 Make a Remote Link or Form Call <%= link_to 'delete', zombie, method: :delete, remote: true %> <a href="/zombies/5" data-method="delete" data-remote="true" rel="nofollow">delete</a> <%= form_for (@zombie, remote: true) do |f| %> <form action="/zombies" data-remote="true" method="post"> 2 Ensure the Controller Can Accept JavaScript Calls respond_to do |format| format.js end 3 Write the JavaScript to Return to the Client app/views/zombies/<action name>.js.erb $('#<%= dom_id(@zombie) %>').fadeOut(); Other jQuery Actions $('<selector>').append(<content or jQuery object>); $('<selector>').effect('highlight'); Requires jQuery UI $('<selector>').text(<string>);