Судя по всему, у нас та же проблема. Я следую той же книге (Rails 3 в действии) и застрял в том же месте. Я не мог определить, где именно проблема, но когда я поставил:
class CommentObserver < ActiveRecord::Observer
def after_create(comment)
p comment.ticket.watchers
(comment.ticket.watchers - [comment.user]).each do |user|
Notifier.comment_updated(comment, user).deliver
end
end
end
Я увидел, что массив наблюдателей объекта комментария содержит дубликат того же пользователя:
[#<User id: 1, email: "alice@ticketee.com", encrypted_password: "$2a$04$D27BhCTxcOqsidMSDhp0FebonA82npQ01iFib3zwYCfT...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2012-07-02 15:32:42", updated_at: "2012-07-02 15:32:42", confirmation_token: nil, confirmed_at: "2012-07-02 15:32:42", confirmation_sent_at: "2012-07-02 15:32:42", admin: false>, #<User id: 1, email: "alice@ticketee.com", encrypted_password: "$2a$04$D27BhCTxcOqsidMSDhp0FebonA82npQ01iFib3zwYCfT...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2012-07-02 15:32:42", updated_at: "2012-07-02 15:32:42", confirmation_token: nil, confirmed_at: "2012-07-02 15:32:42", confirmation_sent_at: "2012-07-02 15:32:42", admin: false>]
Я не знаю, почему, но я только что обошел это, поместив массив идентификаторов пользователей в цикл отправки:
class CommentObserver < ActiveRecord::Observer
def after_create(comment)
sent = []
(comment.ticket.watchers - [comment.user]).each do |user|
Notifier.comment_updated(comment, user).deliver unless sent.include?(user.id)
sent << user.id
end
end
end
Грязно, но это сработало. Я надеюсь, что кто-то сможет выяснить, что здесь произошло.