2

저는 사용자를 인수로 전달하는 데 약 30 개의 메일러 메소드가 있습니다. 뷰에서 @user 변수에 액세스해야하므로 모든 메일러 메서드에서이 인스턴스 변수를 설정해야합니다 (예 : send_x_email (user)).ActionMailer의 인스턴스 변수 설정

일반적으로 이것은 initialize 메소드에서 수행되지만 메일러가 약간 다르게 작동한다는 것을 읽었습니다. 또한 메소드 중 일부는 다른 수의 인수를 사용합니다 (하나는 사용자 만 사용하고 다른 하나는 사용자와 메시지를 사용).

내가 콜백 before_action 조사하고이 게시물

Setting instance variables in Action Mailer?

보았다 ...하지만 난 아직도 붙어했습니다.

메일러 클래스의 30 가지 방법 중 @user = user를 제거하고 사물을 단순화하는 방법에 대한 의견을 보내 주시면 감사하겠습니다. 건배!

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

클래스에 '메일'메소드를 정의하고 인스턴스 변수를 선언하십시오.

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

동의 : 모든 방법에서'@ 사용자 '를 설정하십시오. 실제로 메일러 방법을 컨트롤러 동작과 유사하게 생각할 수 있습니다. 컨트롤러 액션에서는 각 메소드에 대해 인스턴스 변수를 설정하는 것에 대해 두 번 생각하지 않습니다. 요청마다 새로운 컨트롤러 인스턴스가 생성되고 정확히 하나의 액션이 호출된다는 것을 알기 때문입니다. – jjm