Подтвердить что ты не робот

Метод экземпляра ActionMailer используется как метод класса

Ниже приведен краткий отрывок из руководства по ActionMailer

    class UserMailer < ActionMailer::Base
  default :from => "[email protected]"

  def welcome_email(user)
    @user = user
    @url  = "http://example.com/login"
    mail(:to => user.email,
         :subject => "Welcome to My Awesome Site")
  end

end

И в контроллере

class UsersController < ApplicationController
  # POST /users
  # POST /users.xml
  def create
    @user = User.new(params[:user])

    respond_to do |format|
      if @user.save
        # Tell the UserMailer to send a welcome Email after save
        UserMailer.welcome_email(@user).deliver

        format.html { redirect_to(@user, :notice => 'User was successfully created.') }
        format.xml  { render :xml => @user, :status => :created, :location => @user }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end
end

Итак, почему Rails пытается запутать rubyist с помощью методов экземпляра в качестве методов класса? Я предполагаю, что они переопределили отсутствующий метод, но это просто путает! Или я здесь что-то не хватает?

т.е. почему бы не определить welcome_email как def self.welcome_email (пользователь)

4b9b3361

Ответ 1

Если это было #self.welcome_email, вам нужно было бы создать экземпляр класса самостоятельно, что потребует некоторой конфигурации для всех параметров по умолчанию и т.д. Rails просто предоставляет методы factory с тем же именем.

С быстрым взглядом на исходный код вы правы, он, похоже, использует method_missing, где почтовая программа создается с помощью:

mailer = TheMailer.new(: welcome_email, * args)

Rails делает много "вуду" таких вещей, как правило, просто для сохранения количества кода, который вы пишете. Простое изменение #welcome_email для метода класса не даст вам экземпляр.