What\'s new in Rails 2.1

  • View
    2.727

  • Download
    2

  • Category

    Business

Preview:

Citation preview

What’s new in Rails 2.1?

Keith Pitty

Sydney Rails Meetup11 June 2008

over 1,400 contributors

more than 1,600 patches

• Time zones

• Dirty tracking

• Gem dependencies

• Named scope

• UTC-based migrations

• Better caching

Major features

Time zones

New!

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 *BrisbaneCanberraGuamHobartMelbournePort MoresbySydneyVladivostok

# config/environment.rb config.time_zone = 'Sydney'

Times now stored in UTC in the dbbut displayed using the default time zone

If upgrading, times will need to be converted to UTC

Warning!

Add time zone support to users

Example

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="login">Login</label><br/><%= f.text_field :login %></p>

<p><label for="email">Email</label><br/><%= f.text_field :email %></p>

<p><label for="password">Password</label><br/><%= f.password_field :password %></p>

<p><label for="password_confirmation">Confirm Password</label><br/><%= f.password_field :password_confirmation %></p>

<p><label for="time_zone">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 zonein 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

Dirty tracking

New!

$ ./script/consoleLoading development environment (Rails 2.1.0)>> Beer.find :first=> #<Beer id: 1, name: "Coopers Sparkling Ale", created_at: "2008-06-05 11:31:55", updated_at: "2008-06-05 11:31:55">>> b.changed?=> false>> b.name = "Coopers Pale Ale"=> "Coopers Pale Ale">> b.changed?=> true>> b.changed=> ["name"]>> b.name_changed?=> true>> b.name_was=> "Coopers Sparkling Ale">> b.changes=> {"name"=>["Coopers Sparkling Ale", "Coopers Pale Ale"]}>> 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

Updates via other than attr= writer

Warning!

>> b.name_will_change!=> "Coopers Pale Ale">> b.name.upcase!=> "COOPERS PALE ALE">> b.name_change=> ["Coopers Pale Ale", "COOPERS PALE ALE"]

Gem Dependencies

New!

$ 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 gemsrake 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 configurationrequire 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 => 'f4a5c1596f8fff01033b7417629c47fb6344748864b8f3a25fc6884b1ea41d214642f8eba01aa274ef9d1281fc6cdc23bc33ea57ac66878a7b1164b96d875343' } config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net" config.gem "aws-s3", :lib => "aws/s3"end

$ rake gems(in /Users/keithpitty/work/rails2.1demo)[I] hpricot = 0.6[ ] aws-s3

I = InstalledF = Frozen

$ rake gems:install

$ rake gems:unpack

$ rake gems:unpack GEM=hpricot

$ rake gems:unpack:dependencies

$ rake gems:build

# test.rbconfig.gem "mocha"

$ rake gems RAILS_ENV='test'(in /Users/keithpitty/work/rails2.1demo)[I] hpricot = 0.6[ ] aws-s3 [ ] mocha

I = InstalledF = Frozen

Named scope

New!

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: "Coopers Sparkling Ale", brewer: "Coopers", rating: 10, available: true, full_strength: true, created_at: "2008-06-08 07:13:17", updated_at: "2008-06-08 07:13:17">]

>> Beer.rated(0)=> [#<Beer id: 177722761, name: "Fosters Lager", brewer: "Fosters", rating: 0, available: false, full_strength: true, created_at: "2008-06-08 07:13:17", updated_at: "2008-06-08 07:13:17">]

Also: named scope extensions, anonymous scopes

UTC-based migrations

New!

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

Better caching

New!

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, "path/to/cache/directory" ActionController::Base.cache_store = drb_store, "druby://localhost:9192" ActionController::Base.cache_store = mem_cache_store, "localhost"

Or subclass ActiveSupport::Cache::Store and implement read, write, delete and delete_matched methods

A few other tidbits

New!

rake rails:freeze:edge RELEASE=1.2.0

script/plugin installsupports

-e for svn exportand plugins hosted in Git repositories

script/dbconsole

>> " A string full of white spaces ".squish=> "A string full of white spaces"

Thanks for listening

http://keithpitty.com

Recommended