2010-09-06 12 views
7

Ich benutze ein Layout für alle meine E-Mails in meinem Notifier-Modell (20+ E-Mails) ... aber manchmal möchte ich nur eine reine Text-E-Mail ohne Layout oder HTML senden. Ich kann nicht in der Lage sein, herauszufinden, wie? Wenn ich versuche, eine reine Text-E-Mail zu senden, bekomme ich immer noch das Layout und den gesamten HTML-Code in der E-Mail.Schienen Mailer mit verschiedenen Layouts

Ich verwende Rails 2.3.8.

Ich lese über diesen Affenfleck hier ... aber es schien zu zeigen, dass eine neuere Version von Schienen vorbei gekommen war das? Und ich möchte nicht wirklich einen Affenfleck haben, wenn ich einen vermeiden kann.

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 

Ich habe auch 2-Dateien.

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

Es verwendet immer text.html.erb ... auch wenn die content_type ist "text/plain"

Antwort

5

OK, nicht sicher, ob dies funktioniert, aber es scheint der Standard content_type ist text/plain , so müssten Sie nur den Inhaltstyp einstellen, wenn Sie etwas anderes als text/plain wollen.

Try this:

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 

Ich denke immer noch, sollten Sie dies berücksichtigen:

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

Ich würde die oben verwenden, da die Klartext-E-Mail ein 'Layout' zu haben scheint nicht nur der eigentliche Inhalt, den Sie senden möchten.

+0

Das ist wahrscheinlich eine schnelle Lösung, aber ich würde es immer noch mögen, wenn ich herausfinden könnte, warum die Funktionalität, die angeblich eingebaut ist, nicht funktioniert. IE, wenn ich einen content_type deklariere, soll es nach der passenden Datei suchen? – holden

+0

Ich aktualisierte meine Antwort .. nicht sicher, aber es ist einen Versuch wert. Viel Glück. – Mischa

9

edit: Es wurde herausgefunden, die Layouts folgen einem anderen Namensschema als die E-Mail-Vorlagen. benennen Sie sie einfach wie folgt:

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

ich auch den Fehler manuell definieren die Teile hergestellt, wenn Sie diese verwenden:

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

Dann Rails nicht die content_type für Ihren Teil bestimmen kann, und es wird davon ausgegangen es ist HTML.

Nachdem ich diese beiden Dinge geändert hatte, funktionierte es für mich!

ursprüngliche Antwort folgt ..


Ich habe mit dieser Frage viele Male in der Vergangenheit zu kämpfen, in der Regel mit irgendeiner Art von nicht-trockenem quick and dirty Lösung enden. Ich dachte immer, ich wäre der Einzige mit diesem Problem, weil Google genau nichts Nützliches zu diesem Thema aufzeigt.

Diesmal entschied ich mich, in Rails zu graben, um es herauszufinden, aber bisher ohne viel Erfolg, aber vielleicht werden meine Ergebnisse jemandem helfen, dies herauszufinden.

Was ich fand, war, dass in ActionMailer :: Base die #render_message-Methode mit der Bestimmung der richtigen content_type beauftragt ist und sollte es zu @current_template_content_type zuweisen. #default_template_format gibt dann entweder den richtigen Mime-Typ für das Layout zurück oder, wenn @current_template_content_type nicht gesetzt ist, wird standardmäßig: html.

Dies ist, was Action :: Base # render_message wie in meiner app aussieht (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 

Das Problem ist, dass method_name erscheint ein String (der Name der lokalen Ansicht zu sein, in meiner case "new_password.text.html") und Zeichenketten antworten natürlich nicht auf #content_type, was bedeutet, dass @current_template_content_type immer Null bleibt, und so wird das #default_template_format immer auf: html gesetzt.

Nicht viel näher an einer tatsächlichen Lösung, ich weiß. Die Interna von ActionMailer sind einfach zu undurchsichtig für mich.

+0

Hm, interessant. Im Gegensatz zu dem, was Sie sagen, laut der API-Dokumentation ist der standard content_type text/plain ... – Mischa

+0

Das hätte mir auch mehr Sinn gemacht, aber suchen Sie nach #default_template_format in ActionMailer :: Base, das ist der Schuldige soweit wie ich trainieren kann. Ich werde weiter suchen und aktualisieren, wie ich mehr finde. –

+0

Ich denke, ich habe es mehr oder weniger herausgefunden. Mein Problem war, dass ich die Teile manuell mit "part: body => render_message()" definierte. Wenn Sie dies tun, ignoriert ActionMailer den content_type und setzt einfach auf html, wie ich oben beschrieben habe. Wenn Sie jedoch Rails automatisch die Teile bestimmen lassen, erhält render_message eine ActionView :: ReloadableTemplate statt einer Zeichenfolge, die als "method_name" (sprechen Sie über irreführende Variablennamen) und content_type Erkennung funktioniert. –

Verwandte Themen