2

У меня есть около 30 методов почтовой программы, где я передаю пользователя в качестве аргумента. Поскольку мне нужен доступ к переменной @user в представлении, мне нужно установить эту переменную экземпляра в каждом методе почтовой программы, например send_x_email (пользователь).Установка переменных экземпляра в ActionMailer

Обычно это было бы сделано с помощью метода initialize, но я читал, что почтовые программы действуют несколько иначе. Кроме того, некоторые из методов принимают различное количество аргументов (один просто берет пользователя, другой принимает пользователя и сообщение).

Я исследовал before_action обратных вызовов и смотрел на этот пост

Setting instance variables in Action Mailer?

... но я до сих пор застрял.

Я был бы признателен за любые мысли о том, как упростить вещи и удалить @user = пользователь из 30 или около того методов в классе почтовой программы. Ура!

class ReminderSender < ActionMailer::Base 
    def send_commands_email(user) 
    @user = user 
    mail(to: @user.email, 
     subject: "All Commands", 
     from: "<[email protected]#{ENV['DOMAIN']}>") 
    end 

    def send_attachment_warning(user, message) 
    @user = user 
    @message = message 
    mail(to: @user.email, 
     subject: "Attachment Warning", 
     from: "<[email protected]#{ENV['DOMAIN']}>") 
    end 
end 

ответ

2

Попробуйте определить метод «mail» в своем классе и объявить переменную экземпляра, например.

class YouMailer 

    def send_email(user, message) 
    subject = 'something' 
    body = message 

    mail(user, {subject: subject, body: body}}) 
    end 

    def mail(user, options={}) 
    @user = user 
    mail_options = {to: @user.email}.merge(options) 

    super(mail_options) 
    end 
end 

Но вам может потребоваться указать опции 'template_path' и 'template_name' с этой стратегией.

Мое предложение состояло в том, чтобы держать вещи такими, какие они есть. Невозможно использовать «@user = user» во всех ваших методах почтовой программы.

+0

Согласитесь: устанавливайте '@ user' во всех методах. Фактически вы можете думать о методах почтовой рассылки, аналогичных действиям контроллера. В действии контроллера вы не думаете дважды о настройке переменных экземпляра для каждого метода, потому что вы знаете, что для каждого запроса создается новый экземпляр контроллера, и только одно действие когда-либо называется. – jjm

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