2015-12-21 3 views
-2

Учитывая, что мой RewardMailer имеет следующий предварительный просмотр:ActionMailer :: Просмотр не может прочитать простую переменную

class RewardMailerPreview < ActionMailer::Preview 
    @mailman = '[email protected]' 
    @alice = User.create(email: '[email protected]') 
    @bob = User.create(email: '[email protected]') 
    @subject = 'I Vooshed my website' 
    @btc_address = '1BitcoinKKKKKKKK' 
    @amount = 0.004 

    # Preview this email at http://localhost:3000/rails/mailers/reward_mailer/invoice_due 
    def invoice_due 
    RewardMailer.invoice_due(
     alice: @alice, 
     subject: @subject, 
     btc_address: @btc_address 
    ) 
    end 
end 

Я получаю следующее сообщение об ошибке:

NoMethodError in Rails::MailersController#preview 
undefined method `email' for nil:NilClass 
Extracted source (around line #13): 
11 @alice = invoice_info[:alice] 
12 @subject = invoice_info[:subject] 
13 mail to: @alice.email, subject: @subject 
14 end 

RewardMailer мой имеет действие:

def invoice_due(invoice_info) 
    @btc_address = invoice_info[:btc_address] 
    @alice = invoice_info[:alice] 
    @subject = invoice_info[:subject] 
    mail to: @alice.email, subject: @subject 
    end 

и проверено:

test 'invoice_due' do 
    mail = RewardMailer.invoice_due(
     alice: alice, 
     subject: subject, 
     btc_address: btc_address 
    ) 
    assert_equal subject, mail.subject 
    assert_equal [alice.email], mail.to 
    assert_equal [mailman], mail.from 
    assert_match btc_address, mail.body.encoded 
    end 

ответ

3

Вы установили @alice на уровне класса, но вы пытаетесь прочитать его из экземпляра. Я полагаю, вы это делаете для обмена переменным кодом инициализации между разными письмами? Вы можете сделать это так:

class RewardMailerPreview < ActionMailer::Preview 
    def set_defaults 
    @mailman = '[email protected]' 
    @alice = User.create(email: '[email protected]') 
    @bob = User.create(email: '[email protected]') 
    @subject = 'I Vooshed my website' 
    @btc_address = '1BitcoinKKKKKKKK' 
    @amount = 0.004 
    end 

    def invoice_due 
    set_defaults 
    RewardMailer.invoice_due(
     alice: @alice, 
     subject: @subject, 
     btc_address: @btc_address 
    ) 
    end 
end 
+0

Простите мою глупость, но не должен @variables объявлен где-либо быть переменной класса? Вы были бы полезны, если бы вы могли ссылаться на ресурс, объясняющий это! ☺ – amingilani

+1

@amingilani: нет, @ переменные являются переменными экземпляра, и они установлены на то, что является текущим 'self'. Если он находится в методе, он будет установлен, когда вызывается метод, а 'self' является экземпляром класса. Однако, если вы устанавливаете @variables между объектами методов (например, в вопросе), тогда этот код будет запускаться при загрузке класса (а 'self' - это сам этот класс, а не один из его экземпляров). –

+1

@amingilani: @@ переменные, однако, совершенно другое дело. Но вы не должны их использовать. :) –

Смежные вопросы