2011-12-22 34 views
11

UPDATE: Đã có một miếng vá cho vấn đề này: https://github.com/collectiveidea/delayed_job/commit/023444424166ba2ce011bfe2d47954e79edf6798NoMethodError với delayed_job (collectiveidea đá quý)

UPDATE 2: Đối với bất cứ ai chạy vào vấn đề này trên Heroku đặc biệt, tôi đã tìm thấy downgrade để Rake 0.8. 7 và sử dụng công việc trì hoãn phiên bản 2.1.4 hoạt động, trong khi công việc bị trì hoãn v3 không (mặc dù với bản vá nó hoạt động trên máy cục bộ). Đây là trên ngăn xếp Bamboo-mri-1.9.2.

Tôi đang cố triển khai delay_job trên ứng dụng đường ray 3.1.0 cục bộ. Tôi chạy di chuyển và cài đặt các tập tin đá quý:

gem 'delayed_job' 
gem 'delayed_job_active_record' 

Tiếp theo các tài liệu trên github collectiveidea (https://github.com/collectiveidea/delayed_job). Tôi đang thực hiện cuộc gọi chậm trễ từ bộ điều khiển của tôi như sau:

EventMailer.delay.event_message_email(current_user, @event_message) 

Điều này làm cho công việc được bổ sung vào bảng công việc nhưng khi tôi chạy các công việc cào: làm việc nó ghi lại lỗi sau:

Class#event_message_email failed with NoMethodError: undefined method `event_message_email' for Class:Class - 6 failed attempts 

Tôi đã xem các câu hỏi lỗi NoMethod delay_job khác trên SO nhưng không giải quyết được lỗi cụ thể này hoặc cung cấp giải pháp cho nó. Trang collectiveidea đề cập rằng định dạng này không có lời gọi phương thức phân phối là một hack cho cách Rails 3 mailers được thiết lập, vì vậy tôi tự hỏi liệu tài liệu này có thể là một số lỗi thời và nếu có cách gọi mailer mới?

Cập nhật: cũng gọi phương thức gửi thư không chậm trễ hoạt động tốt, và tôi đang chạy nó trên máy chủ đường ray mặc định để vấn đề với Thin được đề cập trong faq collectiveidea không áp dụng. Cảm ơn

+0

Lần cuối bạn khởi động lại tác vụ 'rake jobs: work' là khi nào? Nó cần khởi động lại sau mỗi lần thay đổi mã. – iwasrobbed

+0

EventMailer.event_message_email (current_user, @event_message) .delay.deliver có hoạt động không? – Unixmonkey

+0

@iWasRobbed: có, tôi đã thử rằng – tks

Trả lời

4

Tôi đã khắc phục sự cố này bằng cách chuyển sang phiên bản delay_job (DJ) 2.1.2.

Tôi đang sử dụng: RVM ruby ​​1.8.7 (2010/01/10 patchlevel 249) ray 3.0.9

Gemfile: gem "delayed_job", '2.1.2'

Trước đây, tôi đã cố gắng sử dụng phiên bản mới nhất của delay_job: đá quý "delay_job",: git => 'git: //github.com/collectiveidea/delayed_job.git' cho tôi là v3.0.0.pre

Nhưng: đường ray tạo d elayed_job không tạo tệp di chuyển. Tôi đã tạo nó theo cách thủ công. Sau đó, sau khi 'rake db: di chuyển' tôi đã có bảng để lưu trữ hàng đợi delay_job. Và sau đó, khi tôi nghĩ rằng tất cả phải được làm việc một cách chính xác, tôi đã có cùng một lỗi.

Khi tôi cố tìm nguồn gốc của lỗi này, trong bảng 'delay_jobs' tôi đã thấy rằng các tác vụ của delay_job được lưu không chính xác. Dưới đây là đoạn trích từ trường 'xử lý' trong bảng 'delayed_jobs':

--- !ruby/object:Delayed::PerformableMailer 
object: !ruby/class Notifier 

Như tôi biết, delayed_job được tất cả các nhiệm vụ thông qua lớp Struct, vì vậy nhiệm vụ nên được lưu với tiêu đề isntead của ' 'ruby/struct!' !ruby/đối tượng' Dưới đây là đoạn nhiệm vụ cứu một cách chính xác:

--- !ruby/struct:Delayed::PerformableMailer 
object: !ruby/class Notifier 

Để kiểm tra điều này tôi dừng lại delaed_job quá trình trong giao diện điều khiển. Sau đó, tôi gọi một số phương pháp để đưa nhiệm vụ của DJ vào DB:

Notifier.delay.some_email(current_user, @event_message) 

Sau đó, tôi thay thế thủ công '! Ruby/object' by '! Ruby/struct' in 'handler'. Sau đó, tôi bắt đầu công việc của DJ 'rake: công việc', nó cho tôi biết rằng thư đã được gửi thành công.

Nhưng: - nhiệm vụ này đã không bị xóa khỏi bảng DJ - và thư không được cho người nhận

Vì vậy, tôi đã quyết định rằng đó là một lỗi trong phiên bản mới của delayed_job. Tôi chuyển sang DJ '2.1.2' và nó làm việc cho tôi tốt.

P.S .: Xin lỗi vì tiếng Anh của tôi :)

+0

hi, cảm ơn đánh giá chi tiết, upvoted. Tôi đã thực hiện thay đổi đối với trường bảng và nó cũng xóa công việc để có vẻ như bạn đã đúng. Tôi đã mở này như là một vấn đề trên github và sẽ thêm này như là một tài liệu tham khảo. Tôi chưa thử hạ cấp xuống 2.1.2, vì tôi đang thử một vài thứ khác nữa, và tôi lo ngại rằng điều này sẽ không giải quyết được các vấn đề liên quan đến đường ray 3 thư. – tks

+0

Bằng cách này, vấn đề là tại https://github.com/collectiveidea/delayed_job/issues/323 nếu bạn muốn theo dõi nó – tks

+1

Sukhoviy, hi, cố gắng đi tuyến đường của bạn nhưng thấy rằng bundler không cho phép cài đặt của delay_job_active_record với phiên bản delay_job trước 3.0.0.pre. Cố gắng sử dụng delay_job 2.1.2 mà không có delay_job_active_record dường như không hoạt động. Bạn có thể giải quyết vấn đề này không? Hoặc tôi nên thả nó và sử dụng resque :)? – tks

7

Sử dụng Mailer.delay.send_method dường như lỗi trong Rails 3 (họ đề cập đến đó là một hack trong tài liệu). Tôi đã có cùng NoMethodError và đã giải quyết nó bằng cách sử dụng phương pháp thay thế để tạo công việc được hiển thị trong tài liệu, tức là tạo một lớp Job mới với phương thức thực hiện, ví dụ:

class UserMailerJob < Struct.new(:text, :email) 
    def perform 
    UserMailer.your_mailer_method(text, email).deliver 
    end 
end 

Sau đó, để tạo việc làm, trong điều khiển của tôi:

Delayed::Job.enqueue UserMailerJob.new(@text, @email) 

Đó là một chút thời gian để làm điều này vì sử dụng chậm trễ nhưng có vẻ như để tạo ra công ăn việc làm một cách chính xác và xử lý chúng đáng tin cậy.

0

Chỉ cần lưu ý nhanh. Tôi đã có vấn đề này và đó là vì tôi đã chuyển một biến từ mô hình vào phương thức phân phối BEFORE_SAVE. Chuyển sang AFTER_CREATE đã khắc phục sự cố cho tôi.

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