Обновление Rails 3 - Вы используете старый API в почтовом классе

Я пытаюсь обновить приложение с rails 2.3 до 3.0.6

который имеет следующий код в рельсах 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

В процессе обновления код изменяется, как показано ниже

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

ссылаясь на этот знаменитый блог об использовании ActionMailer в rails 3.0

И наконец побежал rake rails:upgrade:check(проверяет рельсы на 3 несовместимые функции) и показывает

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

(то есть) он говорит, что я все еще использую старый API

Может кто-нибудь объяснить, что мне здесь не хватает?

Или есть какой-то другой способ устранить ошибку "Вы используете старый API в классе почтовой программы"?

К вашему сведению: обновлены драгоценные камни и среда ruby ​​1.8.7, рельсы 3.0.6

2 ответа

Решение

Попробуйте выбросить свой код и написать его снова, используя руководство по ActionMailer. Причиной может быть то, что предложил Фредерик, но ваш код выглядит не очень рельсово;).

Первое, что приходит мне в голову, это как вы передаете тело и тип контента. Тело может быть просто переменной, которую вы будете использовать в представлении, и тип содержимого будет устанавливаться автоматически в зависимости от того, какие представления определены.

Я бы написал что-то вроде:

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

Затем для рендеринга вида:

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

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

Как вы можете прочитать в руководстве, вы также можете создать HTML-версию как app/views/message_sender/send_message.text.erb,

Обновление Rails проверяет ваш код, выполняя некоторые регулярные выражения для него. Это не надежно, например, он пытается защититься от старого способа установки объекта:

subject "foo"

Но тесты, используемые для проверки этого, поймают любой экземпляр слова subject, за которым следует пробел (кроме случаев, когда он используется в качестве символа). Так как у вас есть вызов аргумента subject это может легко случиться. То же самое относится и к from,

Другие вопросы по тегам