2011-06-16 11 views
16

Ecco un breve frammento della guida su ActionMailerActionMailer metodo di istanza viene utilizzato come metodo di classe

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 

E nel controller

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 

Perché, dunque, Rails cercando di confondere la rubyist con metodi di istanza come metodi di classe? Presumo che abbiano sovrascritto il metodo mancante, ma serve solo a confondere! O mi sto perdendo qualcosa qui?

cioè perché non definire welcome_email come def .welcome_email (utente)

risposta

5

Se è stato #self.welcome_email dovreste creare un'istanza della classe da soli, che richiede una certa configurazione per tutti il ​​default params ecc Rails fornisce solo metodi di fabbrica con lo stesso nome.

Da un rapido sguardo al codice sorgente, hai ragione, sembra usare method_missing, dove il mailer è in realtà creato con:

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

Rails fa un sacco di cose "voodoo" come questo, generalmente solo per salvare la quantità di codice che scrivi. Cambiare solo il metodo #welcome_email non ti darebbe un'istanza.

+3

beh, allora le guide dovrebbero continuare con la creazione di una "creazione" o "consegna" anteposta al nome del metodo quando si richiama il mailer. Deprecando quelli (Rails3) in favore del pazzo vudoo, creerai pazzi sviluppatori di vudù che pensano di conoscere il rubino, ma in realtà non lo fanno. –

+0

Hai una domanda o vuoi solo esprimere la tua opinione? ;) Sembra che tu abbia creato un argomento con una domanda retorica, che in realtà non dovresti fare e che probabilmente si chiuderà. – d11wtq

+0

era una domanda - ma basata sulla risposta che il suo "voodoo" piuttosto che su qualche vera ragione logica - credo che sembrerebbe irrilevante. –

Problemi correlati