- 
      
New on edge Rails: JSON serialization of ActiveRecord objects reaches maturity
The last time I wrote about
ActiveRecord#to_jsonon edge Rails, it was missing some key functionality. For one, you couldn't include any associations. Another thing was you couldn't do something like this in your controller:@authors = Author.find(:all) render :json => @authors.to_json(:only => :name)Oh and did I mention it wasn't emitting valid JSON by default?
In the last few weeks, several patches to the Rails trunk have fixed all these issues (most of these patches are already on the Rails 2.0 Preview Release). JSON serialization of ActiveRecord objects is finally on par with XML serialization, and that old Jsonifier plugin I wrote can finally be sent off to the plugin retirement home (though, I am thinking of porting all the JSON patches into Jsonifier to add Rails 2.0-like JSON serialization to Rails 1.2.4, but who knows, I am lazy).
Anyway, back to the new JSON stuff on edge Rails.
No more invalid JSON from Rails
Yes it's true. No more changing of module attribute to get Rails to produce valid JSON. Thanks to Choon Keat with his detailed SVN history snooping, we finally managed to get a patch to fix JSON encoding to quote all hash keys into Rails.
:include option can be used to include associations with ActiveRecord::Base#to_json
At DHH's urging, I submitted a patch that added the
:includeoption toActiveRecord#to_json. Of course, it was a sloppy first submission and DHH pointed that out - a little bit of DRY love and it was really great to see it get committed (I have a soft spot for JSON serialization from Rails, since I'd been trying to achieve the same thing with Jsonifier).So yes, now you can do:
json = @david.to_json(:include => :posts) # or even... json = @david.to_json( :include => { :posts => { :include => { :taggings => { :include => { :tag => { :only => :name } } } } } })Enumerable#to_json and Hash#to_json now accept options
One problem with Jsonifier that I often get emails about is how the
to_jsonoptions don't work for lists (Enumerables). And why is this important? Well, we often retrieve collections of ActiveRecord objects at a time withAR::B#findso it's not too much to ask to be able to do this in your controller actions:@authors = Author.find(:all) render :json => @authors.to_json(:only => :name)But of course you couldn't, so I patched away by changing the
to_jsonmethods of Enumerable and Hash (and other types as well) to accept an optionaloptionsargument. Enumerables will pass on anyoptionsit receives to its elements. Hashes will respect :only and :except (as well as passing on theoptionsto its elements).Unambiguous (non-US-centric) dates and times
While Rails 1.2.3 (and 1.2.4) never supported encoding of Dates, Times and DateTimes, edge Rails has been happily supporting Date, Time and DateTime conversions to JSON since revision 6673. Unfortunately, the date string format is in MM/DD/YYYY format:
Time.now.to_json => "\"09/21/2007 12:15:02 UTC\""Geoff Buesing suggested that Rails should change this to the more unambiguous YYYY/MM/DD format. Finding the right date format is important not only for readability reasons, it's also important that the date string is directly parsable by the many browser JavaScript implementations using the JavaScript
new Date(dateString)function. There is no formal spec of how dates should be represented in JSON, but it's most convenient that strings representing dates can be directly converted into JavaScript Date objects.Testing in several browsers and on different platforms, albeit not extensively, we settled on the
%Y/%m/%d %H:%M:%S %z(strftime) format (more details in the comments of the Trac ticket).Now it is:
Time.now.to_json => "\"2007/09/21 12:15:02 +0800\""Much better.
What's left?
Documentation, for one thing. ActiveRecord::Base#to_json is still undocumented (docfix patch). The
to_jsonmethods for Enumerable and Hash need documentation as well (will patch that soon).ActiveRecord::Base#to_jsonalso doesn't deal with binary attributes, which can be easily resolved by Base64-encoding them (patch coming soon, it gets slightly complicated when trying to do afrom_json). And of course, optimization improvements are always nice (decoding from JSON especially).So, if you use JSON at all, please come in and help patch the remaining bits before Rails 2.0 rolls out. If you can't (or more realistically, don't have the time to) patch Rails yourself, do help out by verifying patches :).
 - 
      
So apparently I'm a Rails Hackfest winner...
Got an email not too long ago from Working With Rails (my profile) entitled "WWR September Hackfest Winner - Congrats!", and almost deleted it thinking it was spam. I read it in the end (after all, how often do you see spam with "Rails" in the subject title), and turns out that my recent patches to Rails pushed me up to 6th position in the September Rails contributors rankings.

I vaguely remember seeing Rails Hackfest mentioned somewhere but only just realized it's a "contest" run monthly. The winners are the top 10 contributors to Rails (contribution being determined by the number of accepted patches, docfixes, and even comments). That's really nice of the sponsors and Working With Rails, since that wasn't really what I'd expected in return for contributing to an Open Source project (that would be a sense of satisfaction, personally-speaking).
I'm just really glad that the JSON patches went into Rails before Rails 2.0 and it is satisfying to see my code get into Rails (I'll blog about the patches in a separate post). There's still some more work needed though - please help to verify and give suggestions or +1s ;).
 - 
      
What's new in Firefox 3: Pasting text into search bar to be 100% less annoying
Now if you're a regular user of Firefox, you've probably already had the opportunity to be dismayed by how you cannot copy and paste text with newlines into the search bar. All you end up with is the first line of text. I just end up typing in the search terms myself or copy and paste line by line.
Try it for yourself with the text here:
First line.
Second line.Well, all that is gonna go away in Firefox 3, which replaces newlines with spaces. Small change perhaps, but definitely needed in this fanboy's opinion.
Oh and it works for the Address bar too, only the newlines get removed instead of getting replaced with spaces. Could be useful for multi-line URLs which appear quite often in emails!
 - 
      
New in Edge Rails: helper for creating form labels
Edge Rails now comes with a helper for creating form labels, so in your views, instead of doing this:
<% form_for(:user, @user, :url => user_path(@user)) do |f| -%> <label for="user_login">Login</label> <%= f.text_field :login %> <end>where the
<label>is given aforattribute ofuser_login(since the convention for form input ids is{MODEL_NAME}_{ATTRIBUTE_NAME}), you can instead now do:<%= label(:user, :login) %>Quite a bit neater. Makes it easier to explain to beginners how they should use
<label>s appropriately since the syntax is similar to the other form helpers. Now give your<label>s properforattributes if you're not doing so already.This makes plugins like this form label helper plugin obsolete.
 - 
      
New in Edge Rails: Serialize ActiveRecord objects to JSON with ActiveRecord#to_json
Converting ActiveRecord instances to their JSON representation has always been a topic that has been dear to me. I'd tried to get a patch that adds
to_jsonto ActiveRecord into Rails (but the quality of my patch was lacking in a few respects). The Jsonifier plugin that I wrote tried to address the lack of built-in JSON serialization by adding aActiveRecord#to_jsonmethod that acts much likeActiveRecord#to_xml.So it is with mixed feelings when I discovered a couple of days ago when DHH committed a changeset that added a native
ActiveRecord#to_jsonmethod. Of course, I'm elated that JSON serialization is given first class attention now, since the raison d'être of Jsonifier and my Rails patch was to do just that. A little bit of me is selfishly disappointed since it means that Jsonifier has become quite obsolete!But it is an excellent change, I look forward to patching it up (if DHH doesn't beat me to it - there've been so much activity on the Rails trunk recently) so that the JSON serializer supports an
:includeoptions for including associations much like forActiveRecord#to_xmland Jsonifier's mixed into_json.Update: I've submitted a patch for adding
:includetoActiveRecord#to_json. Please test it and give feedback or +1 ;). 
subscribe via RSS