2010-09-06 7 views
7

Io uso un layout per tutte le mie email nel mio modello di Notifier (20+ email) ... tuttavia a volte voglio solo inviare un messaggio di testo in chiaro senza layout o html. Non riesco a essere in grado di capire come? Se provo a inviare una e-mail di testo in chiaro, ottengo ancora il layout e tutto l'HTML nell'e-mail.mailer di rails con layout diversi

Sto usando Rails 2.3.8.

Ho letto di questo patch di scimmia qui ... ma sembrava indicare che una versione più recente di binari era finita? E non voglio davvero scimmiottare la patch se posso evitarlo.

Rails - setting multiple layouts for a multipart email with mailer templates

layout "email" # use email.text.(html|plain).erb as the layout 


    def welcome_email(property) 
    subject 'New Signup' 
    recipients property.email 
    from  '[email protected]' 
    body  :property => property 
    content_type "text/html" 
    end 

    def send_inquiry(inquire) 
    subject "#{inquire.the_subject}" 
    recipients inquire.ob.email 
    from  "Test on behalf of #{inquire.name} <#{inquire.email}>" 
    body  :inquire => inquire 
    content_type "text/plain" 

    end 

devo anche 2 file.

email.text.html.erb 
email.text.plain.erb 

utilizza sempre text.html.erb ... anche se il content_type è "text/plain"

risposta

5

OK, non so se questo funziona, ma sembra che il content_type predefinito è text/plain , quindi è necessario impostare il tipo di contenuto solo se si desidera qualcosa di diverso da testo/semplice.

Prova questo:

def send_inquiry(inquire) 
    subject "#{inquire.the_subject}" 
    recipients inquire.ob.email 
    from  "Test on behalf of #{inquire.name} <#{inquire.email}>" 
    body  :inquire => inquire 
end 

penso ancora che si dovrebbe prendere in considerazione questo:

layout "email", :except => [:send_inquiry] 

Vorrei utilizzare il sopra, perché l'e-mail di testo normale non sembrano avere un 'Layout', solo il contenuto effettivo che si desidera inviare.

+0

Questa è probabilmente una soluzione rapida, ma mi piacerebbe ancora se riuscissi a capire perché la funzionalità che è presumibilmente integrata non funzioni. IE, quando dichiaro un content_type, si deve cercare il file appropriato? – holden

+0

Ho aggiornato la mia risposta .. non sono sicuro, ma vale la pena provare. In bocca al lupo. – Mischa

9

modifica: Lo abbiamo capito, i layout seguono uno schema di denominazione diverso per i modelli di email. Proprio rinominarli come segue:

layout.text.html.erb => layout.html.erb 
layout.text.plain.erb => layout.text.erb 

ho anche fatto l'errore di definire manualmente le parti, se si utilizza questo:

part :content_type => 'text/plain', 
    :body => render_message('my_template') 

Poi Rails non può determinare la content_type per la vostra parte e assume è HTML.

Dopo aver cambiato queste due cose ha funzionato per me!

risposta originale segue ..


ho lottato con questa domanda molte volte in passato, di solito finendo con una sorta di soluzione rapida e sporca non-secco. Ho sempre pensato che fossi l'unico con questo problema perché Google non ha trovato esattamente nulla di utile sull'argomento.

Questa volta ho deciso di scavare in Rails per capirlo ma finora senza molto successo, ma forse le mie scoperte aiuteranno qualcun altro a capirlo.

Quello che ho trovato è che in ActionMailer :: Base il metodo #render_message ha il compito di determinare il content_type corretto e deve assegnarlo a @current_template_content_type. #default_template_format restituisce quindi il tipo mime appropriato per il layout oppure, se @current_template_content_type non è impostato, verrà impostato automaticamente su: html.

Questo è ciò che ActionMailer :: Base # render_message assomiglia a mia app (2.3.5)

def render_message(method_name, body) 
    if method_name.respond_to?(:content_type) 
     @current_template_content_type = method_name.content_type 
    end 
    render :file => method_name, :body => body 
    ensure 
    @current_template_content_type = nil 
    end 

Il guaio è che method_name sembra essere una stringa (il nome della vista locale, a mio case "new_password.text.html") e le stringhe ovviamente non rispondono a #content_type, il che significa che @current_template_content_type rimarrà sempre nullo, e quindi il #default_template_format sarà sempre predefinito per: html.

Non molto più vicino a una soluzione reale, lo so. Gli interni di ActionMailer sono troppo opachi per me.

+0

Hm, interessante. Contrariamente a quello che stai dicendo, secondo i documenti API il tipo di contenuto predefinito è text/plain ... – Mischa

+0

Che avrebbe avuto più senso anche per me, ma cerca #default_template_format in ActionMailer :: Base, questo è il colpevole fino ad ora come posso lavorare. Continuerò a cercare e aggiornare questo come trovo di più. –

+0

Penso di aver capito, più o meno. Il mio problema era che stavo definendo le parti manualmente con "part: body => render_message()", se si esegue questo ActionMailer ignora il content_type e solo le impostazioni predefinite in html, come ho descritto sopra. Ma se si consente a Rails di determinare automaticamente le parti, render_message ottiene un ActionView :: ReloadableTemplate anziché una stringa passata come "method_name" (parla di nomi di variabili fuorvianti) e il rilevamento content_type funziona. –