2011-01-14 11 views
5

Tôi có một ứng dụng tự vay cho mô hình sự kiện/người nghe. Một số loại dữ liệu khác nhau được xuất bản (sự kiện), sau đó nhiều thứ khác nhau có thể hoặc có thể không cần phải hành động trên dữ liệu đó (người nghe). Không có thứ tự cụ thể mà người nghe cần phải xảy ra và mỗi người nghe sẽ quyết định có cần phải hành động trong sự kiện hay không.Sự kiện/Quan sát Điều khiển Ruby on Rails

Công cụ nào dành cho các ứng dụng Rails có sẵn để thực hiện tác vụ này? Tôi hy vọng sẽ không phải làm điều này bản thân mình

Chỉnh sửa (mặc dù, tôi có thể Nó không phải là một thỏa thuận RẰNG lớn..): Observer pattern có thể là một lựa chọn tốt hơn cho điều này

+1

Những người nghe này sẽ là các quá trình riêng biệt hay chúng là các khối mã đơn giản có thể được gọi trong quá trình xuất bản dữ liệu? – Nemo157

+0

Có lẽ mã đơn giản chặn 80% thời gian. Các quá trình riêng biệt sẽ là trường hợp hiếm hơn nhưng vẫn có thể xảy ra. – Drew

Trả lời

4

Bạn có lẽ sẽ muốn móc vào lớp Observer của ActiveRecord.

http://api.rubyonrails.org/v3.2.13/classes/ActiveRecord/Observer.html

Với nó, mô hình của bạn có thể thực hiện logic tùy chỉnh cho một số sự kiện vòng đời:

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

Nếu tôi hiểu ý định của bạn một cách chính xác, tất cả các bạn sẽ cần phải làm là gọi các phương pháp đại diện cho hành động của người nghe cho một sự kiện từ những cuộc gọi lại đó.

+0

Điều này rất gần nhưng không phải mọi thứ sẽ được xuất bản là ActiveRecord. Làm thế nào tôi có thể làm một cái gì đó tương tự mà không có nó được gắn với ActiveRecord? – Drew

+0

Bạn luôn có thể đưa chức năng ActiveRecord vào một lớp không phải ActiveRecord bằng cách bao gồm ActiveRecord: Observer. Xem thêm thông tin tại đây: http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/ – Shaun

2

Bạn có thể muốn sử dụng ActiveSupport :: Notifications.instrument.

Đây là cây cầu có mục đích chung để tách sự kiện gửi đến sự kiện phản ứng. Nó hướng đến việc thực hiện tất cả người nghe trong một yêu cầu web đơn lẻ, không giống như EventMachine, hướng đến việc có rất nhiều thứ đồng thời xảy ra.

0

Tôi đã tạo ra một viên ngọc ruby ​​đáp ứng chính xác với trường hợp sử dụng này: event_dispatcher

đá quý này cung cấp một thực hiện quan sát đơn giản, cho phép bạn để đăng ký và lắng nghe cho các sự kiện trong ứng dụng của bạn với một cách đơn giản và hiệu quả.