2009-10-07 35 views
32

tôi đã nghĩ đến việc sử dụng người quan sát hoặc gọi lại. Điều gì và khi nào bạn nên sử dụng một người quan sát?Quan sát viên so với số gọi lại

F.e. bạn có thể làm như sau:

# User-model 
class User << AR 
    after_create :send_greeting! 

    def send_greeting! 
    UserNotifier.deliver_greeting_message(self) 
    end 

end 

#observer 
class UserNotifier << AR 
    def greeting_message(user) 
    ... 
    end 
end 

hoặc bạn có thể tạo một người quan sát và để cho nó xem khi người dùng trở nên tạo ...

Dou bạn recommened gì?

Trả lời

9

Cuộc gọi lại ngắn hơn: Bạn chuyển nó vào một hàm được gọi một lần. Đó là một phần của API trong đó bạn thường không thể gọi hàm mà không cần chuyển một cuộc gọi lại. Khái niệm này được kết hợp chặt chẽ với chức năng của nó. Thông thường, bạn chỉ có thể chuyển một cuộc gọi lại duy nhất ..

Ví dụ: Chạy một chuỗi và gọi lại được gọi khi chuỗi kết thúc.

Một người quan sát sống lâu hơn và có thể được gắn/tách ra bất cứ lúc nào. Có thể có nhiều nhà quan sát cho cùng một điều và họ có thể có những kiếp sống khác nhau.

Ví dụ: Hiển thị giá trị từ một mô hình trong giao diện người dùng và cập nhật mô hình từ đầu vào của người dùng.

27

Bạn có thể sử dụng các nhà quan sát làm phương tiện tách hoặc phân phối trách nhiệm. Theo nghĩa cơ bản - nếu mã mô hình của bạn bị bắt đầu quá lộn xộn để suy nghĩ về việc sử dụng các nhà quan sát đối với một số hành vi không cần thiết. Sức mạnh thực sự (ít nhất là tôi thấy) của các nhà quan sát nằm trong khả năng của họ để phục vụ như một điểm kết nối giữa các mô hình của bạn và một số hệ thống con khác có chức năng được sử dụng bởi tất cả (hoặc một số) của các lớp khác. Giả sử bạn quyết định thêm thông báo IM vào ứng dụng của mình - giả sử bạn muốn được thông báo về một số (hoặc tất cả) hành động CRUD của một số (hoặc tất cả) các mô hình trong hệ thống của bạn. Trong trường hợp này, các nhà quan sát sẽ là lý tưởng - hệ thống con thông báo của bạn sẽ tách biệt hoàn toàn với logic nghiệp vụ của bạn và các mô hình của bạn sẽ không bị xáo trộn với hành vi không phải của doanh nghiệp của họ. Một trường hợp sử dụng tốt cho các nhà quan sát sẽ là một hệ thống con kiểm toán.

41

Một điểm khác biệt quan trọng cần lưu ý, có liên quan đến câu trả lời của Milan Novota, là các cuộc gọi lại trên ActiveRecord có khả năng hủy bỏ hành động được gọi và tất cả các cuộc gọi lại tiếp theo.

class Model < ActiveRecord::Base 
    before_update :disallow_bob 

    def disallow_bob 
    return false if model.name == "bob" 
    end 
end 

class ModelObserver < ActiveRecord::Observer 
    def before_update(model) 
    return false if model.name == "mary" 
    end 
end 

m = Model.create(:name => "whatever") 

m.update_attributes(:name => "bob") 
=> false -- name will still be "whatever" in database 

m.update_attributes(:name => "mary") 
=> true -- name will be "mary" in database 

Các quan sát viên chỉ có thể quan sát, họ không thể can thiệp.

+19

Đây không còn là trường hợp trong đường ray 3.1 người quan sát có thể hủy bỏ hành động tiết kiệm bằng cách trả về false từ before_ * sẽ hủy hành động và cũng có thể tăng ngoại lệ sau_ * để hủy bỏ hành động đặc biệt. –

+0

Cảm ơn jrizza, tôi đã có một trường hợp tương tự trong đó một thất bại trong một trong những nhà quan sát gây ra hồ sơ không lưu, mà tôi nghĩ là một kết quả không mong muốn. –

+2

Có lạ, họ không còn là người quan sát, ngoại lệ trong một người quan sát sẽ khiến cho cam kết thất bại và người dùng nhận được một màn hình ngoại lệ. Không hợp lý với tôi. – Amala

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