I’ve been working with the ActiveSalesforce gem, which is very cool but also frustrating, because there are numerous versions of it and none of them is authoritative. I started with the “basic” one you’ll get if you begin at the RubyForge page. It works, but I encountered problems trying to get relationships to work using belongs_to and so forth.
I looked around a bit, and ended up trying the fork by John Reilly, which fixed that problem, and things seemed to be working well. Then I discovered an odd error, which was causing any fields containing an ampersand (‘&’) to be truncated such that everything up to and including the ampersand was being lost. This meant names like ‘Acme & Associates’ came out as simply ‘ Associates’. Not so cool.
>> my_obj = Salesforce::Account.find('0014000000MNdgAAAA')
activesalesforce: sql=SELECT * FROM Account WHERE (Account.id = '0014000000MNdgAAAA')
#<Salesforce::Account:0x1051f7e48> {
:id => "0014000000MNdgAAAA",
:name => " Associates"
Note that the name isn’t ‘Acme & Associates’ — everything up to the ampersand is being lost during the fetch. I added some debugging output in the gem to verify that the result being passed back was indeed truncated. Thanks to the ActiveSalesforce mailing list I was pointed to some other forks, and I grabbed one of them seemed a likely candidate, being forked from the althor880-activerecord-activesalesforce-adapter one, which included a switch to using Hpricot for XML parsing. So I did a git clone of http://github.com/blaines/activerecord-activesalesforce-adapter.git, did gem build activerecord-activesalesforce-adapter.gemspec and sudo gem install activerecord-activesalesforce-adapter-2.3.7.gem and tried it out. Note that in my case, the commit at HEAD that I grabbed had some unfixed merge conflicts that I had to take care of before I could build the gem, which was inconvenient but not a big problem. Most importantly, indeed, it did the trick: the fields are now coming through with the ampersands intact!
Sadly, however, I started getting a new error on testing in my app:
/!\ FAILSAFE /!\ Wed Aug 25 14:21:25 -0700 2010 Status: 500 Internal Server Error User can't be referred
I scratched my head for a bit, and then looking at the log I saw:
(eval):1: warning: already initialized constant User (eval):1: warning: already initialized constant User (eval):1: warning: already initialized constant Assets (eval):1: warning: already initialized constant User (eval):1: warning: already initialized constant User (eval):1: warning: already initialized constant User (eval):1: warning: already initialized constant Note ...etc...
I hadn’t seen this before with the other version of the gem. It implied, though, that on startup it was initializing a bunch of Salesforce-related classes. Weird, but I went ahead and created a new Salesforce::User class in my app:
class Salesforce::User < Salesforce::SalesforceBase set_table_name "User" end
SalesforceBase is simply my small base class that handles setting the connection information so I can set it in one place for all of my Salesforce-related models. And what do you know, once I had this class, it apparently disambiguated things, and the error went away. I’m guessing that there was a namespace collision with the User class needed by Devise, and creating this one to point to Salesforce cleared up the confusion. Not ideal, but I can live with it.
So I now have something that works. Clearly, though, there are overall issues with this gem — although the Rubygems page looks nice, it doesn’t seem to point to a canonical “latest and greatest” version, and there are a half-dozen forks in various different states. This makes it pretty difficult to know exactly what you’re getting when you try to work with ActiveSalesforce, unfortunately.

Thanks for posting that! I’m just at the beginning of using an ActiveSalesforce 2.3.8 fork (http://github.com/tomheinan/activesalesforce ) and am glad to see a survey of some of the other forks and their pitfalls!
would love to see what the base class looks like.