[英]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.