Ruby on Rails 101.2

farrightΛογισμικό & κατασκευή λογ/κού

15 Αυγ 2012 (πριν από 5 χρόνια και 6 μέρες)

292 εμφανίσεις

Ruby on Rails 101.2

WTF?


Created by Matz in 1993


Inspired by Smalltalk


Rubygems = CSPAN


Rake = ant


Rdoc = javadoc


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 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.

http://www.theserverside.com/news/thread.tss?thread_id=33120

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.

http://www.theserverside.com/news/thread.tss?thread_id=33120

Convention over configuration

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 sqlite3
-
ruby' (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

“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

http://innig.net/software/ruby/closures
-
in
-
ruby.rb

myArray = Array.new [3, 4, 3, 9]

myArray.each do |i|

puts I

end

Sans goalpoasts

Avec goalpoasts

3.times {


puts “Hello world”

}

http://innig.net/software/ruby/closures
-
in
-
ruby.rb

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 “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

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 new


@item = Item.new

end

def update


@item = Item.new params[:item]


if @item.save



flash[:notice] = ‘Item was created’


else



render :action => “new”


end

end

Read


rake rails:freeze:gems

def index


@items = Item.find :all

end

def show


@item = Item.find params[:id]

end

Update


rake rails:freeze:gems

def edit


@item = Item.find params[:id]

end

def show


@item = Item.find params[:id]

end

Delete

rake rails:freeze:gems

def edit


@item = Item.find params[:id]


@item.destory

end

Adding Authentication

./script/plugin install
http://svn.techno
-
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


<%= yield %> renders content

Get a template



Google: ‘yui builder’





<%= stylesheet_link_tag 'application' %>

<%= javascript_include_tag :defaults %>