簡體   English   中英

定義為實例方法的類方法

[英]Class methods defined as instance methods

這是 Michael Hartle 書中的工作代碼。 這是app/mailers/user_mailer.rb的郵件程序代碼,用於為用戶帳戶創建激活郵件:

class UserMailer < ActionMailer::Base
  def account_activation(user)
    @user = user
    mail to: user.email, subject: "Account activation"
  end
end

郵件的預覽是使用test/mailers/previews/user_mailer_preview.rb的 ruby​​ 文件生成的:

class UserMailerPreview < ActionMailer::Preview
  def account_activation
    user = User.first
    user.activation_token = User.new_token
    UserMailer.account_activation(user)
  end
end

account_activation方法被定義為user_mailer.rb一個實例方法。 但它在預覽生成器中用作類方法。 我誤解了代碼還是這里發生了其他事情?

致有同樣疑問的人

這就是 ActionMailer 的工作方式。 電子郵件在擴展ActionMailer::Base的類中被定義為實例方法,但您可以作為類方法訪問它們。

這就是ActionMailer工作方式。 電子郵件在擴展ActionMailer::Base的類中被定義為實例方法,但您可以作為類方法訪問它們。

class MyMailer < ActionMailer::Base
  def my_email
  end
end

MyMailer.my_email
# and not MyMailer.new.my_email

這是一個快捷方式,它將實例化 ActionMailer 類的實例,調用相應的電子郵件方法並返回電子郵件消息。 這是處理調用的代碼

魔術背后是deliver/deliver_now/deliver_later (或任何其他交付方法):

def deliver_now
  processed_mailer.handle_exceptions do
    message.deliver
  end
end

看起來processed_mailer是我們正在尋找的關鍵方法:

def processed_mailer
  @processed_mailer ||= @mailer_class.new.tap do |mailer|
    mailer.process @action, *@args
  end
end

此方法創建郵件程序的實例,使用@action參數(實例方法的名稱)和@args調用 process 方法, @action參數是傳遞給類方法的參數,最后它返回創建的實例郵遞員。

所以這就是郵件方法被聲明為實例方法但被調用為類方法的原因。

快樂學習:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM