2011-06-16 14 views
16

Oto krótki fragment z przewodnika na ActionMailerActionMailer metoda instancji używany jak metody klasy

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 

iw sterowniku

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 

Więc dlaczego Rails próbuje zmylić rubyist z metod instancji jako metody klasowe? Zakładam, że zastąpili brakującą metodę, ale to tylko pomylenie! Czy może czegoś tutaj brakuje?

czyli dlaczego nie definiują welcome_email jako def siebie .welcome_email (użytkownik)

Odpowiedz

5

Jeśli było #self.welcome_email trzeba by utworzyć instancję klasy siebie, co wymaga trochę konfigurację wszystkich domyślnych params etc Rails dostarcza tylko fabryczne metody o tej samej nazwie.

Od szybki rzut oka na kodzie źródłowym, masz rację, to nie wydaje się, aby skorzystać method_missing, gdzie Mailer jest rzeczywiście stworzony z:

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

Rails ma wiele rzeczy typu "voodoo" w ten sposób, ogólnie po to, aby zaoszczędzić ilość kodu, który napiszesz. Po prostu zmiana #welcome_email na metodę klasy nie dałaby ci instancji.

+3

Cóż, wtedy szyny powinny być kontynuowane z opcją "create" lub "deliver" dodaną do nazwy metody podczas wywoływania programu mailer. Wycofanie tych (Rails3) na korzyść zwariowanego vudoo ma na celu stworzenie zwariowanych programistów vudoo, którzy myślą, że znają ruby, ale tak naprawdę to nie robią –

+0

Masz pytanie lub po prostu chcesz wyrazić swoją opinię? ;) Wygląda na to, że stworzyłeś temat z pytaniem retorycznym, którego tak naprawdę nie powinno się robić i prawdopodobnie zostanie zamknięty. – d11wtq

+0

było to pytanie - ale na podstawie odpowiedzi, że jego "voodoo", a nie jakiś prawdziwy logiczny powód - myślę, że to wygląda na nieistotne. –

Powiązane problemy