2017-12-15 19 views
1

ActionMailer 코딩에 대해 다소 혼란 스럽습니다.Rails ActionMailer 코딩에 대한 이해

은 표준 액션 메일러는 예를

응용 프로그램/우편물/example_mailer.rb

class ExampleMailer < ActionMailer::Base 
    default from: "[email protected]" 

    def sample_email(user) 
    @user = user 
    mail(to: @user.email, subject: 'Sample Email') 
    end 
end 

응용 프로그램/컨트롤러는/users_controller.rb

def create 
    @user = User.new(user_params) 

    respond_to do |format| 
    if @user.save 

     # Sends email to user when user is created. 
     ExampleMailer.sample_email(@user).deliver_now 

     format.html { redirect_to @user, notice: 'User was successfully created.' } 
     format.json { render :show, status: :created, location: @user } 
    else 
     format.html { render :new } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
    end 
end 

내 질문은 관련이 있습니다

ExampleMailer.sample_email(@user).deliver_now 
  1. 어떻게 ExampleMailer 액세스 ExampleMailer.new없이 sample_email 방법은? sample_email은 클래스 메소드가 아닙니다!

  2. ExampleMailer으로 전화 하시겠습니까?

분명합니다. 어떤 도움을 주셔서 감사합니다.

답변

1

맞아요. sample_email은 클래스 메소드가 아닙니다. 인스턴스 메소드입니다. 그러나 ExampleMailer은 영리한 메타 프로그래밍을 수행하는 ActionMailer::Base에서 상속됩니다.

ExampleMailer.simple_email에 전화 할 때 클래스 메서드가 없으므로 자동으로 개인 메서드 method_missing이 호출됩니다.

method_missing에서 인스턴스 메소드가 존재하는지 확인하고 메일러 인스턴스 객체를 만들고 (기본적으로 .new을 작성합니다) 메일러 객체의 인스턴스 메소드를 호출 한 다음 객체를 반환합니다. 개체의 경우 원래 줄에 해당 메서드를 지정한 이후로 deliver_now 또는 deliver_later 메서드를 호출했습니다. ExampleMailer 인스턴스 방법을 찾을 수없는 경우에 당신이했던 것처럼

my_mail_thing = ExampleMailer.sample_email(@user) 
my_mail_thing.deliver_now 

그러나 ... 기본적으로 같은, 그것은 예를 들어, 다시 표준 누락 된 응답에 떨어진다 "NoMetihodError :: 예기치 않은 메서드 'another_simple_email'for ExampleMail.Class"

모두 매우 놀랍습니다. 검색 용어를 사용하여 method_missing에 대한 자세한 내용을 볼 수 있으며 자신의 수업을 시험해 볼 수 있습니다.