April 6th, 2008
I’m gonna post up the Living on the Edge a little earlier this week because I’ve found I just can’t keep up (when things get busy) with 2 separate sets of notes for the Rails Envy podcast and another for my own blog posts.
From this week onwards, I’ll be following Pratik’s suggestion to post about changes as they happen instead of after an entire week so expect a slight change in the format of Living on the edge for next week!
This week’s report covers changes from 31 Mar 2008 to 6 Apr 2008 (the day the corresponding Rails Envy podcast was recorded).
Rails.env, Rails.logger, Rails.cache, Rails.root
This has been a long time coming: You can now use Rails.env instead of RAILS_ENV, Rails.root instead of RAILS_ROOT, Rails.logger instead of RAILS_DEFAULT_LOGGER, and Rails.cache instead of RAILS_CACHE. Not having to use constants is nice because it always felt a bit dirty to have so many hard-coded constants in the Rails namespace.
Credit goes to Pratik Naik, the newest Rails core team member for this cleanup.
Related changeset: http://dev.rubyonrails.org/changeset/9180
Render :partial now works with a collection of heterogeneous elements
You can now use render :partial to render a collection of different elements and Rails will figure out which partial template to use. For example:
render :partial => [ monkey, donkey, dramatic_chipmunk ]
will render the monkey with the ‘monkeys/_monkey.html.erb’ partial, donkey with the ‘donkeys/_donkey.html.erb’ partial, and last but definitely not lest, dramatic_gopher with the ‘dramatic_chipmunks/_dramatic_chipmunk.html.erb’ partial
This is especially useful if when using STI, where your ActiveRecord model would return objects of different types. The collection [ monkey, donkey, dramatic_chipmunk ] could very well be something returned from your Animal model that has subclasses of Monkey, Donkey and DramaticChipmunk via STI.
Credit: Zach Dennis of ar-extensions fame.
Related changeset: http://dev.rubyonrails.org/changeset/9177
ActiveModel work revived
It seems like work on ActiveModel (think unified ActiveRecord and ActiveResource behaviors) has been revived, if the latest commits (http://dev.rubyonrails.org/changeset/9171 and http://dev.rubyonrails.org/changeset/9173) by David (DHH) is anything to go by.
Bugfix: Assigning an invalid has_one association now causes #save to fail on parent
You could do this before:
firm = Firm.find(:first)
firm.account = Account.new # Associate INVALID account
firm.save # This doesn't fail
Now that’s fixed thanks to Pratik Naik.
Related changeset: http://dev.rubyonrails.org/changeset/9232
As usual, any feedback is respectfully appreciated!
April 5th, 2008
This week’s report covers changes from 24 Mar 2008 to 30 Mar 2008 (the day the corresponding Rails Envy podcast was recorded).
There’re lots of big exciting changes this week on edge. Smells like 2.1 soon!
has_finder gem merged into Rails
Ryan Daigle has the scoop on the new has_finder-like functionality in Rails so head on over (I won’t repeat it here in the interests of DRY).
Credit goes to Nick Kallen for coming up with the has_finder gem.
Related changeset: http://dev.rubyonrails.org/changeset/9084
ActiveRecord: Unsaved attribute changes are now tracked
You can now ask an ActiveRecord model whether its attributes have been changed (and is unsaved) using the {attr_name}_changed? (magic) method. The {attr_name}_was method will return the original value of the attribute, and the {attr_name}_change method will return an array with 2 members, the 1st being the original value, the 2nd being the changed (and unsaved) value.
# Change person's name.
person.name = 'Jason Seifer'
person.changed? # => true
person.name_changed? # => true
person.name_was # => 'jseifer'
person.name_change # => ['jseifer', 'Jason Seifer']
person.name = 'Ceiling Cat'
person.name_change # => ['jseifer', 'Ceiling Cat']
Credit goes to Rails core team member Jeremy Kemper (bitsweat) for this patch (which originated from Jeremy’s very own Dirty plugin).
Related changeset: http://dev.rubyonrails.org/changeset/9127
ActiveRecord#Base.all/first/last
Now you can do:
Post.all.each { |post| # something }
Post.first
Post.last
Kinda like how some other ORMs do (like DataMapper).
Credit: thechrisoshow and again, Nick Kallen for has_finder.
Related changeset: http://dev.rubyonrails.org/changeset/9085
Timestamped Migrations
This is more useful than it sounds: migrations are now timestamped instead of using incremental numbers in your db/migrate folder. This eliminates the problem of migrations having the same version number when working on a multi-developer Rails app.
Two new Rake tasks, rake db:migrate:up/down, have been added to allow running of the up and down methods of individual migrations.
Credit goes to John Barnette, the guy who gave you foxy fixtures.
Related changeset: http://dev.rubyonrails.org/changeset/9122
New config.gem option for specifying which gems are required by the application + rake tasks for installing and freezing gems
Specify which gems are required by your Rails app in your Rails environment.rb! “Vendor everything” supported right in Rails :). An example:
Rails::Initializer.run do |config|
config.gems 'chronic'
config.gems "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
config.gems "aws-s3", :lib => "aws/s3"
end
There are also new Rake tasks:
# List required gems.
rake gems
# Install all required gems:
rake gems:install
# Unpack specified gem to vendor/gems/gem_name-x.x.x
rake gems:unpack GEM=chronic
Credit goes to the prolific Rick Olson for this gem of a patch.
Related changeset: http://dev.rubyonrails.org/changeset/9140
ActiveResource #clone
You can now clone an existing resource:
gregg = Person.find(1)
borg = gregg.clone
This doesn’t clone child ActiveResource members though, just the straight up attributes of resource.
Contribors: Ryan Daigle and thechrisoshow.
Related changeset: http://dev.rubyonrails.org/changeset/9121
Big documentation patch
A big doc patch consisting of all the efforts going on in the doc-rails repository on Github has been committed. Check out Pratik’s post for more info on what doc-rails is. Though with Rails moving to Git soon, doc-rails may no longer be necessary!
Related changeset: http://dev.rubyonrails.org/changeset/9093