Question

I'm trying to upgrade an application from rails 2.3 to 3.0.6

which has the following code in rails 2.3

class MessageSender < ActionMailer::Base
    def send_message(subject,to,from,body,respondent = nil, content_type = 'text/plain')
      @content_type        = content_type
      @subject             = subject
      @recipients          = to
      @from                = from
     # @sent_on             = Time.now
      @body                = {:body_text => body}
    end
end

In the upgrade process the code is modified as below

class MessageSender < ActionMailer::Base
    def send_message(subjet,to,from,body,respondent = nil,content_type='text/plain')
      mail(:to => to, :subject => subject, :from => from, :body => body, :content_type => content_type)
    end
end

by referring to this famous blog about using ActionMailer in rails 3.0

And finally ran rake rails:upgrade:check(checks for rails 3 incompatible functions) and it shows

Old ActionMailer class API
You're using the old API in a mailer class.
More information: http://lindsaar.net/2010/1/26/new-actionmailer-api

The culprits: 
        - app/models/message_sender.rb

(i.e) It says I'm still using Old API

Can somebody explain what am I missing here ?

Or is there any other way to eliminate "You're using the old API in a mailer class" bug ?

FYI: the gems are updated and environment is ruby 1.8.7,rails 3.0.6

Was it helpful?

Solution

Try throwing your code away and write it again using ActionMailer guide. The reason can be as Frederick suggested but also your code doesn't look very rails 3 way ;).

The first thing that comes to my mind is how you pass body and content type. Body can be just variable which you will use in view and content type will be set automatically based on what views are defined.

I would write something like:

class MessageSender < ActionMailer::Base
  def send_message(subject, to, from, body)
    # @sent_on           = Time.now
    @body                = body
    mail(:to => to, :subject => subject, :from => from)
  end
end

Then to render a view:

# app/views/message_sender/send_message.text.erb 

My nice text email.
And my body is <%= @body %>

As you can read in the guide, you can also create html version as app/views/message_sender/send_message.text.erb.

OTHER TIPS

Rails upgrade checks your code by running some regular expressions against it. This isn't foolproof, for example it's trying to guard against the old style way to set the subject:

subject "foo"

But the tests used to check for that will catch any instance of the word subject followed by a space (except when used as a symbol). Since you've got an argument call subject this could easily happen. The same is true of from.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top