Download Ruby on Rails 101.2 - Amazon Web Services

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
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 %>