2010-09-06 26 views
7

Tôi sử dụng một bố cục cho tất cả email của mình trong mẫu Thông báo của tôi (hơn 20 email) ... tuy nhiên đôi khi tôi chỉ muốn gửi một email văn bản thuần túy không có bố cục hoặc html. Tôi dường như không thể hiểu được làm thế nào? Nếu tôi cố gắng gửi một email văn bản thuần túy, tôi vẫn nhận được bố cục và tất cả HTML trong email.mailer với bố trí khác nhau

Tôi đang sử dụng Rails 2.3.8.

Tôi đã đọc về bản vá khỉ này ở đây ... nhưng dường như nó chỉ ra một phiên bản mới hơn của đường ray đã vượt qua điều này? Và tôi không thực sự muốn vá khỉ nếu tôi có thể tránh được.

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 

Tôi cũng có 2 tác phẩm.

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

Nó luôn luôn sử dụng text.html.erb ... ngay cả khi content_type là "text/plain"

Trả lời

5

OK, không chắc chắn nếu làm việc này, nhưng có vẻ như các content_type mặc định là text/plain , vì vậy bạn chỉ cần đặt loại nội dung nếu bạn muốn một cái gì đó khác với văn bản/đồng bằng.

Hãy thử điều này:

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 

tôi vẫn nghĩ rằng bạn nên xem xét điều này:

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

Tôi sẽ sử dụng ở trên vì email văn bản đơn giản dường như không có một 'bố trí', chỉ nội dung thực tế bạn muốn gửi.

+0

Đó có thể là một sửa chữa nhanh, nhưng tôi vẫn muốn nó nếu tôi có thể tìm ra lý do tại sao chức năng được cho là được xây dựng không hoạt động. IE, khi tôi khai báo content_type, nó được cho là tìm kiếm tệp thích hợp? – holden

+0

Tôi đã cập nhật câu trả lời của mình .. không chắc chắn, nhưng đáng để thử. Chúc may mắn. – Mischa

9

chỉnh sửa: Đã tìm ra, các bố cục tuân theo lược đồ đặt tên khác nhau cho các mẫu email. Chỉ cần đổi tên họ như sau:

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

Tôi cũng đã sai lầm khi tự xác định các bộ phận, nếu bạn sử dụng này:

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

Sau đó Rails có thể không xác định content_type cho phía bạn và nó giả đó là HTML.

Sau khi tôi thay đổi hai thứ đó, nó đã hiệu quả với tôi!

trả lời ban đầu sau ..


Tôi đã vật lộn với câu hỏi này nhiều lần trong quá khứ, thường kết thúc với một số loại phi khô giải pháp nhanh chóng và dơ bẩn. Tôi luôn nghĩ rằng tôi là người duy nhất có vấn đề này vì Google không có gì hữu ích về chủ đề này.

Lần này tôi quyết định đào sâu vào Rails để tìm ra nhưng cho đến nay không có nhiều thành công, nhưng có lẽ những phát hiện của tôi sẽ giúp người khác tìm ra điều này.

Điều tôi thấy là trong ActionMailer :: Căn cứ phương thứC#render_message được giao nhiệm vụ xác định đúng content_type và gán nó cho @current_template_content_type. #default_template_format sau đó trả về loại mime phù hợp cho bố cục hoặc, nếu @current_template_content_type không được đặt, nó sẽ mặc định là: html.

Đây là những gì ActionMailer :: Base # render_message trông giống như trong ứng dụng của tôi (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 

Vấn đề là method_name dường như là một chuỗi (tên của quan điểm địa phương, trong tôi trường hợp "new_password.text.html") và chuỗi tất nhiên không respond_to #content_type, nghĩa là @current_template_content_type sẽ luôn giữ nguyên và do đó #default_template_format sẽ luôn được mặc định là: html.

Không gần gũi hơn với giải pháp thực tế, tôi biết. Các ActionMailer internals chỉ là quá mờ đục đối với tôi.

+0

Hm, thú vị. Trái ngược với những gì bạn đang nói, theo các tài liệu API mặc định content_type là văn bản/đồng bằng ... – Mischa

+0

Điều đó sẽ có ý nghĩa hơn với tôi nữa, nhưng hãy tìm #default_template_format trong ActionMailer :: Base, đó là thủ phạm cho đến nay như tôi có thể làm việc. Tôi sẽ tiếp tục tìm kiếm và cập nhật điều này khi tôi tìm thấy nhiều hơn. –

+0

Tôi nghĩ tôi đã tìm ra, nhiều hay ít. Vấn đề của tôi là tôi đã xác định các phần bằng tay với "part: body => render_message()", nếu bạn làm ActionMailer này bỏ qua content_type và chỉ mặc định là html, như tôi đã mô tả ở trên. Nhưng nếu bạn để Rails tự động xác định các phần, render_message sẽ nhận được một ActionView :: ReloadableTemplate thay vì một chuỗi được chuyển thành "method_name" (nói về các tên biến gây hiểu lầm) và phát hiện content_type hoạt động. –

Các vấn đề liên quan