Ruby on Rails 101.2 - Amazon Web Services

Download Report

Transcript Ruby on Rails 101.2 - Amazon Web Services

Ruby on Rails 101.2
WTF?
•
•
•
•
•
Created by Matz in 1993
Inspired by Smalltalk
Rubygems = CSPAN
Rake = ant
Rdoc = javadoc
QuickTime™ and a
TIFF (PackBits) decompressor
are needed to see this picture.
http://rubyurl.com/D1LA
How its like Java
•
•
•
•
•
Object orientated
Supports single inheritance
Has exceptions
Runs on multiple OS’s
Runs on Java runtime (using jruby)
How it differs
•
•
•
•
Loosely typed until assigned
Supports closures / passing blocks
Supports ‘modular’ design (mixins)
Poor language level support for mulitthreaded execution
• No primitives (int, float etc)
When might you use it?
YARJC: Yet another Rails vs.
Java Comparison
QuickTime™ and a
TIFF (PackBits) decompressor
are needed to see this picture.
• Justin Gehtland
recently tried reimplementing one of
his web applications
in Ruby on Rails
instead of his
normal Java
Spring/Hibernate
setup, according to
a Slashdot post.
http://www.theserverside.com/news/thread.tss?thread_id=33120
YARJC: Yet another Rails vs.
Java Comparison
• Justin Gehtland
recently tried reimplementing one of
his web applications
in Ruby on Rails
instead of his
normal Java
Spring/Hibernate
according to
Convention setup,
over configuration
a Slashdot post.
QuickTime™ and a
TIFF (PackBits) decompressor
are needed to see this picture.
http://www.theserverside.com/news/thread.tss?thread_id=33120
Setup
• http://www.rubyonrails.org/down
• http://www.sqlite.org/
– The version that comes with Leopard isn't high
enough. You'll need to get he source and make /
sudo make install. Then run 'gem install sqlite3ruby' (all on the mac). The binaries should do for
windows.
• http://download.netbeans.org/netbeans/6.0/fin
al/
http://subversion.tigris.org/project_packages.
html
Resources
• http://groups.google.com/group/ruby_ire
land/web/rails-resources
• http://railscasts.com/
• http://www.railsenvy.com/
• http://tinyurl.com/ytgp8d ;)
What we’ll cover
•
•
•
•
:symbols
Passing blocks
Creating objects
Closures
:symbols
Symbols are
‘weird string’s
• Immutable (cannot be reassigned)
• Used internally to represent language elements
• eg: 100 would have a symbol assocaited with it
• Commonly used in hash maps as keys
“a”.intern = :a
Passing blocks
(goal posts)
Sans goalpoasts
3.times do
puts “Hello world”
End
Avec goalpoasts
myArray = Array.new [3, 4, 3, 9]
myArray.each do |i|
puts I
end
http://innig.net/software/ruby/closures-in-ruby.rb
Sans goalpoasts
3.times {
puts “Hello world”
}
Avec goalpoasts
myArray = Array.new [3, 4, 3, 9]
myArray.each { |i|
puts i
}
http://innig.net/software/ruby/closures-in-ruby.rb
Hashes
myHash = { :name => “James”, :occupation =>
“Programmer” }
myHash.each { |i, k|
puts “#{i}:#{k}”
}
Everything is an object
class James
initialize
puts “initializing”
@x = 3 # defines a member variable
end
# provides an accessor
def x
@x
end
# set x from outisde of the
def x= arg
@x = arg
end
end
http://innig.net/software/ruby/closures-in-ruby.rb
class Person
attr_accessor :second_name
initialize
puts “initializing”
@first_name = 3 # defines member variable
end
end
http://innig.net/software/ruby/closures-in-ruby.rb
~ jkennedy$ irb
irb(main):001:0> require 'test'
=> true
irb(main):002:0> j = James.new
initialising
=> #<James:0x1cc8e4 @x=3>
irb(main):003:0> j.x
=> 3
irb(main):004:0> j.x= 5
=> 5
irb(main):005:0> j.x
=> 5
irb(main):006:0>
Exceptions
class RaisingExceptionionator
def initialize
begin
file = open “some_file”
rescue
file = STDIN
retry # error?
end
end
end
Closures
# Example 1:
def thrice
yield
yield
yield
end
x=5
puts "value of x before: #{x}"
thrice { x += 1 }
puts "value of x after: #{x}"
http://innig.net/software/ruby/closures-in-ruby.rb
# Example 2: local scope
def thrice_with_local_x
x = 100
yield
yield
yield
puts "value of x at end of thrice_with_local_x: #{x}"
end
x=5
thrice_with_local_x { x += 1 }
puts "value of outer x after: #{x}"
http://innig.net/software/ruby/closures-in-ruby.rb
# Example 3:
thrice do # note that {...} and do...end are equivalent
y = 10
puts "Is y defined inside the block where it is first set?"
puts "Yes." if defined? y
end
puts "Is y defined in the outer context after being set in the
block?"
puts "No!" unless defined? y
http://innig.net/software/ruby/closures-in-ruby.rb
#Example 4: yield and scope
def six_times(&block)
thrice(&block)
thrice(&block)
end
x=4
six_times { x += 10 }
puts "value of x after: #{x}"
http://innig.net/software/ruby/closures-in-ruby.rb
# Example 5
# So do we have closures? Not quite! We can't hold on #to
a &block and call it later at an arbitrary
# time; it doesn't work. This, for example, will not #compile:
#
# def save_block_for_later(&block)
# saved = &block;
# end
#
# But we *can* pass it around if we use drop the &, and use
block.call(...) instead of yield:
def save_for_later(&b)
@saved = b # Note: no ampersand! This turns a block
into a closure of sorts.
end
http://innig.net/software/ruby/closures-in-ruby.rb
# Example 5 : … continued
save_for_later { puts "Hello!" }
puts "Deferred execution of a block:"
@saved.call
@saved.call
http://innig.net/software/ruby/closures-in-ruby.rb
@saved_proc_new = Proc.new { puts "I'm declared with
Proc.new." }
@saved_proc = proc { puts "I'm declared with proc." }
@saved_lambda = lambda { puts "I'm declared with
lambda." }
def some_method
puts "I'm declared as a method."
end
@method_as_closure = method(:some_method)
puts "Here are four superficially identical forms of deferred
execution:"
@saved_proc_new.call
@saved_proc.call
@saved_lambda.call
@method_as_closure.call
http://innig.net/software/ruby/closures-in-ruby.rb
Modules
• Modules cannot be instantiated
• Define a set of ‘behaviours’ which an
object can ‘inherit’
Module Politeness
def say_hello
puts “Hello”
end
end
class Ambassador
def initialize
require ‘Politeness’
end
end
kofi = Ambassador.new
kofi.say_hello
Rails 2.0.2
: rails myfirstproject
: cd myfirstproject
: rake rails:freeze:gems
: script/generate - -help
: script/destroy - -help
: script/migration - -help
: script/resource - -help
: script/scaffold - -help
Rails 2.0.2
: rails myfirstproject
: cd myfirstproject
: rake rails:freeze:gems
: script/generate - -help
: script/destroy - -help
: script/migration - -help
: script/resource - -help
: script/scaffold - -help
Freezing rails
Imports the rails
Code into your app
QuickTime™ and a
TIFF (LZW) decompressor
are needed to see this picture.
Sqllite
:script/generate model Person name:string
phone:integer biography:text
:rake db:create
:rake db:migrate
:sqllite3 db/development.sqllite3
sqllite>.tables
Anatomy of a project
Global configuration
Methods available in views
Active Record Classes *
QuickTime™ and a
TIFF (PackBits) decompressor
are needed to see this picture.
Active Record Classes *
Templates
URL => controller configuration
CRUD
•
•
•
•
Create => [ new, update]
Read => [ list, show]
Update => [edit, update]
Delete => [destroy]
Create
def new
@item = Item.new
rake rails:freeze:gems
end
def update
@item = Item.new params[:item]
if @item.save
flash[:notice] = ‘Item was created’
else
render :action => “new”
end
end
Read
def index
@items = Item.find :all
rake rails:freeze:gems
end
def show
@item = Item.find params[:id]
end
Update
def edit
@item = Item.find params[:id]
rake rails:freeze:gems
end
def show
@item = Item.find params[:id]
end
Delete
def edit
@item = Item.find params[:id]
@item.destory rake rails:freeze:gems
end
Adding Authentication
./script/plugin install http://svn.techno-
weenie.net/projects/plugins/restful_authenti
cation/
./script/generate authenticated user sessions
Session
only
Active
Record
Setting site template
• #{APP_ROOT}/app/views/layout/#{mod
el_name}.erb
• <%= yield %> renders content
Get a template
• Google: ‘yui builder’
<%= stylesheet_link_tag 'application' %>
<%= javascript_include_tag :defaults %>