Ruby on Rails 101.2
WTF? Created by Matz in 1993 Inspired by Smalltalk Rubygems = CSPAN Rake = ant Rdoc = javadoc
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 mulit- threaded execution No primitives (int, float etc)
When might you use it?
YARJC: Yet another Rails vs. Java Comparison Justin Gehtland recently tried re- implementing one of his web applications in Ruby on Rails instead of his normal Java Spring/Hibernate setup, according to a Slashdot post.
YARJC: Yet another Rails vs. Java Comparison Justin Gehtland recently tried re- implementing one of his web applications in Ruby on Rails instead of his normal Java Spring/Hibernate setup, according to a Slashdot post. Convention over configuration
Setup –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 sqlite3- ruby' (all on the mac). The binaries should do for windows. al/ html
Resources land/web/rails-resourceshttp://groups.google.com/group/ruby_ire land/web/rails-resources ;)
What we’ll cover :symbols Passing blocks Creating objects Closures
:symbols
“a”.intern = :a 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
Passing blocks (goal posts)
3.times do puts “Hello world” End myArray = Array.new [3, 4, 3, 9] myArray.each do |i| puts I end Sans goalpoasts Avec goalpoasts
3.times { puts “Hello world” } myArray = Array.new [3, 4, 3, 9] myArray.each { |i| puts i } Sans goalpoasts Avec goalpoasts
Hashes myHash = { :name => “James”, :occupation => “Programmer” } myHash.each { |i, k| puts “#{i}:#{k}” }
Everything is an object
class James initialize puts = 3 # defines a member variable end # provides an accessor def end # set x from outisde of the def x= = arg end
class Person attr_accessor :second_name initialize puts = 3 # defines member variable end
~ jkennedy$ irb irb(main):001:0> require 'test' => true irb(main):002:0> j = James.new initialising => # 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
Closures
# Example 1: def thrice yield end x = 5 puts "value of x before: #{x}" thrice { x += 1 } puts "value of x after: #{x}"
# Example 2: local scope def thrice_with_local_x x = 100 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}"
# 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
#Example 4: yield and scope def six_times(&block) thrice(&block) end x = 4 six_times { x += 10 } puts "value of x after: #{x}"
# 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 = █ # end # # But we *can* pass it around if we use drop the &, and use block.call(...) instead of yield: def = b # Note: no ampersand! This turns a block into a closure of sorts. end
# Example 5 : … continued save_for_later { puts "Hello!" } puts "Deferred execution of a
@saved_proc_new = Proc.new { puts "I'm declared with Proc.new." = proc { puts "I'm declared with proc." = lambda { puts "I'm declared with lambda." } def some_method puts "I'm declared as a method." = method(:some_method) puts "Here are four superficially identical forms of
Modules Modules cannot be instantiated Define a set of ‘behaviours’ which an object can ‘inherit’ Module Politeness def say_hello puts “Hello” end
class Ambassador def initialize require ‘Politeness’ end kofi = Ambassador.new kofi.say_hello
Rails : rails myfirstproject : cd myfirstproject : rake rails:freeze:gems : script/generate - -help : script/destroy - -help : script/migration - -help : script/resource - -help : script/scaffold - -help
Rails : 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
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 * Templates Active Record Classes * URL => controller configuration
CRUD Create => [ new, update] Read => [ list, show] Update => [edit, update] Delete => [destroy]
Create rake rails:freeze:gems def = Item.new end def = Item.new params[:item] flash[:notice] = ‘Item was created’ else render :action => “new” end
Read rake rails:freeze:gems def = Item.find :all end def = Item.find params[:id] end
Update rake rails:freeze:gems def = Item.find params[:id] end def = Item.find params[:id] end
Delete rake rails:freeze:gems def = Item.find end
Adding Authentication./script/plugin install weenie.net/projects/plugins/restful_authenti cation/./script/generate authenticated user sessions Active Record Session only
Setting site template #{APP_ROOT}/app/views/layout/#{mod el_name}.erb renders content
Get a template Google: ‘yui builder’