代码之家  ›  专栏  ›  技术社区  ›  Khoga

了解Rails ActionMailer编码

  •  1
  • Khoga  · 技术社区  · 7 年前

    我对ActionMailer编码有点困惑。

    标准操作邮件程序示例

    app/mailers/example\u mailer。rb型

    class ExampleMailer < ActionMailer::Base
      default from: "from@example.com"
    
      def sample_email(user)
        @user = user
        mail(to: @user.email, subject: 'Sample Email')
      end
    end
    

    应用程序/控制器/用户\u控制器。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 通道 sample_email 方法不带 ExampleMailer.new ? sample\u电子邮件 不是类方法!

    2. 怎样 deliver_now 呼叫 示例Mailer ?

    我希望这是清楚的。感谢您的帮助。

    1 回复  |  直到 7 年前
        1
  •  1
  •   SteveTurczyn    7 年前

    你说得对 sample_email 不是类方法,而是实例方法。但是 ExampleMailer 继承自 ActionMailer::Base 这做了一些聪明的元编程。

    当你打电话的时候 ExampleMailer.simple_email 它找不到类方法,因此会自动调用私有方法 method_missing .

    在里面 缺少方法\u 它检查实例方法是否存在,创建一个mailer实例对象(因此它基本上执行 .new ,调用mailer对象上的instance方法,然后返回该对象。。。在那个物体上,你调用了 deliver_now deliver_later 方法,因为您在原始行中指定了这些方法。基本上和你做的一样。。。

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

    但是,如果ExampleMailer找不到实例方法,它会使用标准的缺失响应,例如,ExampleMail的“NoMetihodError::undefined method‘another\u simple\u email’:Class”

    这一切都很神奇。您可以阅读更多关于 缺少方法\u 通过谷歌搜索这个术语,你可以在自己的课堂上进行实验。