What\'s new in Rails 2.1
Upcoming SlideShare
Loading in...5
×
 

What\'s new in Rails 2.1

on

  • 3,960 views

 

Statistics

Views

Total Views
3,960
Views on SlideShare
3,955
Embed Views
5

Actions

Likes
0
Downloads
15
Comments
0

2 Embeds 5

http://osexp2000.appspot.com 3
http://www.slideshare.net 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

What\'s new in Rails 2.1 What\'s new in Rails 2.1 Presentation Transcript

  • What’s new in Rails 2.1? Keith Pitty Sydney Rails Meetup 11 June 2008
  • over 1,400 contributors
  • more than 1,600 patches
  • Major features • Time zones • Dirty tracking • Gem dependencies • Named scope • UTC-based migrations • Better caching
  • New! Time zones courtesy of Geoff Busing
  • $ rake -T time (in /Users/keithpitty/work/rails2.1demo) rake time:zones:all # Displays names of all time zones recognized by the... rake time:zones:local # Displays names of time zones recognized by the Rai... rake time:zones:us # Displays names of US time zones recognized by the ...
  • $ rake time:zones:local * UTC +10:00 * Brisbane Canberra Guam Hobart Melbourne Port Moresby Sydney Vladivostok
  • # config/environment.rb config.time_zone = 'Sydney'
  • Times now stored in UTC in the db but displayed using the default time zone
  • Warning! If upgrading, times will need to be converted to UTC
  • Example Add time zone support to users
  • Add time_zone to User model
  • Add time_zone_select to signup view
  • <h1>Sign up as a new user</h1> <% @user.password = @user.password_confirmation = nil %> <%= error_messages_for :user %> <% form_for :user, :url => users_path do |f| -%> <p><label for=quot;loginquot;>Login</label><br/> <%= f.text_field :login %></p> <p><label for=quot;emailquot;>Email</label><br/> <%= f.text_field :email %></p> <p><label for=quot;passwordquot;>Password</label><br/> <%= f.password_field :password %></p> <p><label for=quot;password_confirmationquot;>Confirm Password</ label><br/> <%= f.password_field :password_confirmation %></p> <p><label for=quot;time_zonequot;>Time zone</label><br/> <%= f.time_zone_select :time_zone, TimeZone.all %> <p><%= submit_tag 'Sign up' %></p> <% end -%>
  • Use before_filter to set time zone in ApplicationController
  • class ApplicationController < ActionController::Base helper :all protect_from_forgery include AuthenticatedSystem before_filter :set_user_time_zone private def set_user_time_zone Time.zone = current_user.time_zone if logged_in? end end
  • New! Dirty tracking
  • $ ./script/console Loading development environment (Rails 2.1.0) >> Beer.find :first => #<Beer id: 1, name: quot;Coopers Sparkling Alequot;, created_at: quot;2008-06-05 11:31:55quot;, updated_at: quot;2008-06-05 11:31:55quot;> >> b.changed? => false >> b.name = quot;Coopers Pale Alequot; => quot;Coopers Pale Alequot; >> b.changed? => true >> b.changed => [quot;namequot;] >> b.name_changed? => true >> b.name_was => quot;Coopers Sparkling Alequot; >> b.changes => {quot;namequot;=>[quot;Coopers Sparkling Alequot;, quot;Coopers Pale Alequot;]} >> b.save => true >> b.changed? => false
  • Partial updates by default in new Rails 2.1 apps
  • SQL (0.000138) BEGIN Beer Update (0.000304) UPDATE `beers` SET `updated_at` = '2008-06-05 11:38:01', `name` = 'Coopers Pale Ale' WHERE `id` = 1 SQL (0.005019) COMMIT
  • Warning! Updates via other than attr= writer
  • >> b.name_will_change! => quot;Coopers Pale Alequot; >> b.name.upcase! => quot;COOPERS PALE ALEquot; >> b.name_change => [quot;Coopers Pale Alequot;, quot;COOPERS PALE ALEquot;]
  • New! Gem Dependencies
  • $ rake -T gem (in /Users/keithpitty/work/rails2.1demo) rake gems # List the gems that this rails application ... rake gems:build # Build any native extensions for unpacked gems rake gems:install # Installs all required gems for this applic... rake gems:unpack # Unpacks the specified gem into vendor/gems. rake gems:unpack:dependencies # Unpacks the specified gems and its depende... rake rails:freeze:gems # Lock this application to the current gems ...
  • # environment.rb # Bootstrap the Rails environment, frameworks, and default configuration require File.join(File.dirname(__FILE__), 'boot') Rails::Initializer.run do |config| config.time_zone = 'Sydney' config.action_controller.session = { :session_key => '_rails2.1demo_session', :secret => 'f4a5c1596f8fff01033b7417629c47fb6344748864b8f3a25fc6884b1ea41d214642f8eba01aa274ef9d128 1fc6cdc23bc33ea57ac66878a7b1164b96d875343' } config.gem quot;hpricotquot;, :version => '0.6', :source => quot;http://code.whytheluckystiff.netquot; config.gem quot;aws-s3quot;, :lib => quot;aws/s3quot; end
  • $ rake gems (in /Users/keithpitty/work/rails2.1demo) [I] hpricot = 0.6 [ ] aws-s3 I = Installed F = Frozen
  • $ rake gems:install
  • $ rake gems:unpack
  • $ rake gems:unpack GEM=hpricot
  • $ rake gems:unpack:dependencies
  • $ rake gems:build
  • # test.rb config.gem quot;mochaquot;
  • $ rake gems RAILS_ENV='test' (in /Users/keithpitty/work/rails2.1demo) [I] hpricot = 0.6 [ ] aws-s3 [ ] mocha I = Installed F = Frozen
  • New! Named scope courtesy of Nick Kallen
  • class Beer < ActiveRecord::Base named_scope :available, :conditions => {:available => true} named_scope :unavailable, :conditions => {:available => false} named_scope :heavy, :conditions => {:full_strength => true} named_scope :light, :conditions => {:full_strength => false} named_scope :cats_piss, :conditions => {:rating => 0..3} named_scope :drinkable, :conditions => ['rating > 3'] named_scope :minimum_rating, lambda { |min_rating| { :conditions => ['rating >= ?', min_rating] } } named_scope :rated, lambda { |rating| { :conditions => ['rating = ?', rating] } } named_scope :awesome, lambda { |*args| { :conditions => ['rating >= ?', (args.first || 9)] } } end
  • >> Beer.count => 15 >> Beer.available.count => 9 >> Beer.heavy.available.count => 8 >> Beer.heavy.available.drinkable.count => 6 >> Beer.heavy.available.minimum_rating(7).count => 5 >> Beer.heavy.available.awesome.count => 3 >> Beer.heavy.available.awesome(10).count => 1
  • >> Beer.heavy.available.awesome(10) => [#<Beer id: 888319404, name: quot;Coopers Sparkling Alequot;, brewer: quot;Coopersquot;, rating: 10, available: true, full_strength: true, created_at: quot;2008-06-08 07:13:17quot;, updated_at: quot;2008-06-08 07:13:17quot;>]
  • >> Beer.rated(0) => [#<Beer id: 177722761, name: quot;Fosters Lagerquot;, brewer: quot;Fostersquot;, rating: 0, available: false, full_strength: true, created_at: quot;2008-06-08 07:13:17quot;, updated_at: quot;2008-06-08 07:13:17quot;>]
  • Also: named scope extensions, anonymous scopes
  • New! UTC-based migrations
  • Migration prefix no longer simply sequential
  • Migration prefix now uses UTC timestamp
  • mysql> select * from schema_migrations; +----------------+ | version | +----------------+ | 20080604194357 | | 20080604195453 | | 20080605112923 | +----------------+ 3 rows in set (0.00 sec)
  • Especially helpful for teams (avoids most conflicts)
  • Also helpful when working on branches
  • Migrations are applied intelligently
  • Also: change_table method introduced to migrations
  • New! Better caching
  • Specify preferred caching engine in environment.rb
  • # Following options supplied in Rails 2.1: ActionController::Base.cache_store = memory_store ActionController::Base.cache_store = file_store, quot;path/to/cache/directoryquot; ActionController::Base.cache_store = drb_store, quot;druby://localhost:9192quot; ActionController::Base.cache_store = mem_cache_store, quot;localhostquot;
  • Or subclass ActiveSupport::Cache::Store and implement read, write, delete and delete_matched methods
  • New! A few other tidbits
  • rake rails:freeze:edge RELEASE=1.2.0
  • script/plugin install supports -e for svn export and plugins hosted in Git repositories
  • script/dbconsole
  • >> quot; A string full of white spaces quot;.squish => quot;A string full of white spacesquot;
  • Resources • http://weblog.rubyonrails.com/2008/6/1/rails-2-1-time-zones- dirty-caching-gem-dependencies-caching-etc • Ryan Bates’ Railscasts • Ryan Daigle’s feature introductions • Ruby on Rails 2.1: What’s New? by Carlos Brando
  • Thanks for listening http://keithpitty.com