1

@delivery_options個々のメーラーメソッド内からインスタンス変数にアクセスできない理由がわかりません...

class UserMailer < ActionMailer::Base

    @delivery_options = {
            user_name: 'foo',
            password: 'bar',
            address: 'smtp.foobar.net'
    }

    def invite_email (email, project)
        logger.debug( @delivery_options ) #WHY IS THIS IS UNDEFINED??
        @project = project

        #THIS WORKS FINE
        mail(to: email, subject: "WORK DAMMIT", delivery_method_options: {
                user_name: 'foo',
                password: 'bar',
                address: 'smtp.foobar.net'
        })

        #THIS FAILS
        #mail(to: email, subject: "WORK DAMMIT", delivery_method_options: @delivery_options)

    end


end
4

2 に答える 2

3

これらが「静的」データである場合は、次のようにすることができます。

class UserMailer < ActionMailer::Base

    DELIVERY_OPTIONS = {
        user_name: 'foo',
        password: 'bar',
        address: 'smtp.foobar.net'
    }

    def invite_email(email, project)
        mail(to: email, subject: "WORK DAMMIT", delivery_method_options: DELIVERY_OPTIONS)
        ...
    end
end

これはうまくいくはずです。

インスタンス変数を使用する場合は、次のようにする必要があります。

class UserMailer < ActionMailer::Base

    def initialize
        @delivery_options = {
            user_name: 'foo',
            password: 'bar',
            address: 'smtp.foobar.net'
        }
    end

    def invite_email(email, project)
        mail(to: email, subject: "WORK DAMMIT", delivery_method_options: @delivery_options)
        ...
    end
end

このようにして、使用している UserMailer のインスタンスで変数が定義されます。あなたが行った方法は、UserMail クラスでインスタンス変数を定義することでした。

于 2013-09-19T16:40:16.983 に答える
2

最初のインスタンス変数定義 ( @delivery_options) は、クラスでのみ使用でき、そのメソッドでは使用できません。それが、この問題に直面している理由です。クラス変数 ( @@delivery_options) は、クラス内のすべてのメソッドで使用できますが、クラス変数は本質的にスレッド セーフではないため、それほど頻繁には使用されません。

以上のことから、おそらく定数を使用してこれらを定義し、定数を参照するだけで済みます。または、さらに良いことに、次のようにActionMailer のデフォルト システムを使用して、いくつかのデフォルトの配信オプションを設定します。

class UserMailer < ActionMailer::Base
  default {user_name: 'foo', password: 'bar', address: 'smtp.foobar.net'}

  ...
end

すべてのデフォルトはメーラーのすべてのメソッドに適用されますが、ローカルで指定したオプションによって上書きされます。

于 2013-09-19T16:53:53.450 に答える