0

アプリケーションを rails 2.3 から 3.0.6 にアップグレードしようとしています

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

アップグレード プロセスでは、コードは次のように変更されます。

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

Rails 3.0 で ActionMailer を使用する方法については、この有名なブログを参照してください。

そして最後に実行しrake rails:upgrade:check(Rails 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

(ie) まだ古い APIを使用していると表示される

誰かがここで何が欠けているのか説明できますか?

または、「メーラー クラスで古い API を使用しています」というバグを解消する他の方法はありますか?

参考までに: gem は更新され、環境は ruby​​ 1.8.7、rails 3.0.6 です。

4

2 に答える 2

1

コードを破棄して、 ActionMailer ガイドを使用して再度記述してみてください。理由は、フレデリックが示唆したように、コードが非常にレールのように見えない可能性があります;)。

最初に頭に浮かぶのは、body と content タイプを渡す方法です。本文は、ビューで使用する単なる変数にすることができ、コンテンツ タイプは、定義されているビューに基づいて自動的に設定されます。

私は次のように書きます:

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

于 2013-05-01T09:07:50.310 に答える
0

Rails のアップグレードでは、正規表現を実行してコードをチェックします。これは絶対確実ではありません。たとえば、件名を設定する古いスタイルの方法を守ろうとしています。

subject "foo"

しかし、それをチェックするために使用されるテストは、サブジェクトという単語の後にスペースが続くすべてのインスタンスをキャッチします (シンボルとして使用される場合を除く)。引数呼び出しがあるため、subjectこれは簡単に発生する可能性があります。についても同様ですfrom

于 2013-05-01T07:55:36.093 に答える