Archive for December, 2008

switch from enhanced migrations plugin to rails timestamped migrations

December 27, 2008 , Written By  Surendra Singhi.

On our rails 1.2.* project we were using enhanced migrations plugin. Recently we decided to make a switch to rails 2.2.* and wanted to use default UTC based migrations versioning which is a part of the rails core now.

Enhanced migrations plugin uses the table migrations_info to store the migrations information but rails 2.2 uses the table schema_migrations by default. When one does rake db:migrate, the rails code checks whether the schema_migrations table exists or not, if the table is not there, then it is created, and if the schema_info table is present, then this table is populated with all migrations upto the version in the schema_info table. But, since we were using the enhanced migrations plugin, the table schema_info was present but wasn’t being used.

So, to make the switch to rails 2.2.* timestamped migrations before doing regular rake db:migrate the following sql code had to be run, to ensure that schema_migrations table is pre-created, and has the correct list of all migrations which have been run.

create table schema_migrations (version varchar(255) not null primary key);
INSERT INTO schema_migrations select id from migrations_info;
drop table if exists schema_info;

multipart emails with mailer templates

December 23, 2008 , Written By  Surendra Singhi.

Update: The code given below here causes the exception notification plugin to stop working, get the fixed code from this post. It also contains a better technique to organize the mailers.

Rails 2.2 has added a very cool new feature which allows the use of layouts for mailer-templates, just like the way layouts can be used for views. This is great, but there is one gotcha, when you try sending a multi-part email (both text and html, as you should be), it wraps the mail content with the same layout for both the text/plain version and the text/html version.

After digging around a bit in the ActionMailer code, I came up with the following monkey patch, which will use the layout only for the text/html version of the email. You can put this code in your environment.rb file, it won’t use layout when the mail-template content type is ‘text/plain’.

  1. # monkey patch action mailer to not use layouts for text/plain emails
  2. module ActionMailer
  3.   class Base
  4.     private
  5.     def candidate_for_layout?(options)
  6.       (!options[:file] || options[:file].content_type != ‘text/plain’) && !@template.send(:_exempt_from_layout?, default_template_name)
  7.     end
  8.   end
  9. end

If you can come up with some other better solution than this, then let us know.