2011-06-29 26 views
10

Tôi đang cố gắng trì hoãn một email thông báo được gửi tới người dùng khi đăng ký ứng dụng của tôi. Các email được gửi bằng cách sử dụng một số ActionMailer mà tôi gọi là InitMailer. Cách tôi đang cố trì hoãn công việc là sử dụng số delayed_jobhttps://github.com/collectiveidea/delayed_job của tập đoàn. Để thực hiện điều này, bạn có thể thấy rằng tôi chỉ định handle_asynchronously sau khi xác định phương pháp initial_email:Làm thế nào để sử dụng delay_job để làm cho Rails 3.0 ActionMailer chạy không đồng bộ? Gặp ArgumentErrors

class InitMailer < ActionMailer::Base 
    default :from => "[email protected]" 

    def initial_email(user) 
    @user = user 
    @url = "http://www.blahblahblah.com" 
    mail(:to => user.email, 
     :subject => "Welcome to my website!" 
     ) 
    end 

    handle_asynchronously :initial_email 
end 

Tuy nhiên, tôi gặp phải một lỗi lập luận trong tập tin đăng nhập của tôi "delayed_job.log":

Class#initial_email failed with ArgumentError: wrong number of arguments (1 for 0) - 5 
failed attempts 

Để biết thông tin của bạn, email là được gửi trong bộ điều khiển bằng cách sử dụng dòng:

@user = InitUser.new(params[:init_user]) 
InitMailer.delay.initial_email(@user) 

Ngoài ra, khi tôi thiết lập mã của mình mà không bị trì hoãn, các email ere được gửi ra mà không có vấn đề (ngoại trừ thực tế là nó làm chậm ứng dụng của tôi chờ đợi cho các máy chủ gmail)

Trường hợp gây ra lỗi ở đây? Làm thế nào tôi có thể nhận được thư bị trì hoãn để gửi đúng cách?

Trả lời

10

Do cách Rails3 triển khai người gửi thư, có một số giải pháp khác thường cho delay_jobs. Ví dụ, bạn đã thấy rằng để trì hoãn việc gửi thư, bạn viết

ExampleMailer.delay.example(user) 

Trong khi thông thường bạn sẽ phải viết handle_asynchronously sau khi định nghĩa phương pháp, trong trường hợp bưu phẩm khai này (đối với một số lý do) ngăn cản mà công việc bị trì hoãn từ làm việc.

Vì vậy, trong mã này, thả tờ khai hoàn toàn:

class InitMailer < ActionMailer::Base 
    default :from => "[email protected]" 

    def initial_email(user) 
    @user = user 
    @url = "http://www.blahblahblah.com" 
    mail(:to => user.email, 
      :subject => "Welcome to my website!" 
     ) 
    end 

    #No handle_asynchronously needed here 
end 
+0

Cảm ơn bạn! Đây là câu trả lời cho những rắc rối của tôi. Ước gì tôi đã làm việc với một người như yoU! – geb2011

+0

Tuyệt vời. Tôi chỉ lãng phí 2 ngày cố gắng để con số này ra (cũng là một vấn đề với một kẻ đánh chặn gây ra một thất bại và Gmail không muốn chấp nhận email từ môi trường phát triển của tôi). – Clay

+0

Tôi muốn sử dụng Mandrill để gửi email thay vì Gmail, ngay cả đối với môi trường phát triển. – Dean

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