2012-02-07 22 views
6

Tôi muốn triển khai một hệ thống thông báo đơn giản trên trang web của tôi nơi một mục chưa đọc/chưa đọc được hiển thị cho người dùng. Tương tự như được sử dụng trên Stack Exchange cho hộp thư đến của người dùng, nơi các nhận xét chưa đọc về các câu hỏi, v.v. được hiển thị.Làm cách nào để biết liệu nội dung nào đó đã được đọc trong Rails để thông báo

Tôi đã xem qua this question cung cấp tổng quan về cách tôi làm điều này. Những gì tôi đang bối rối về là làm thế nào để tìm ra nếu một cái gì đó đã được đọc. Tôi có thể thêm một cột read_at nhưng làm cách nào để thực sự lấp đầy nó? Nếu bất cứ ai có thể giúp tôi với một số hướng dẫn cơ bản tôi sẽ đánh giá cao nó!

CẬP NHẬT # 1: gì nếu tôi thêm một điều kiện để Item # chương trình hành động của tôi, nơi tôi kiểm tra user_id (ID của người sử dụng tạo ra các item) chống lại current_user.id. Một cái gì đó giống như dưới đây:

unless @item.user_id == current_user.id 
    @item.read_at = Time.now 
end 

CẬP NHẬT # 2: Sử dụng mã dưới đây, tôi đang cố gắng để cập nhật của thông điệp read_at nếu nó phù hợp với recipient_idcurrent_user ID. Tuy nhiên nó không hoạt động.

def show 
    @message = Message.find(params[:id]) 
    if @message.recipient_id == current_user.id 
    @message.read_at == Time.now 
    @message.save 
    end 
    respond_to do |format| 
    format.html # show.html.erb 
    format.xml { render :xml => @message } 
    end 
end 

CUỐI CÙNG UPDATE: Nhờ @prasvin, đây là giải pháp của tôi. Tôi đã thêm một cột read_at vào đối tượng. Đối tượng cũng có cột recipient_id hiện tại. Vì vậy, trong chương trình hành động điều khiển của tôi, tôi đặt như sau:

def show 
    @message = Message.find(params[:id]) 
    if @message.recipient_id == current_user.id 
    @message.update_attributes(:read_at => Time.now) 
    end 
    respond_to do |format| 
    format.html # show.html.erb 
    format.xml { render :xml => @message } 
    end 
end 

Sau đó, trong tập tin helper.rb tôi:

def new_messages 
    Message.where(:recipient_id => current_user.id, :read_at => nil).count 
end 

Và trong cách bố trí của tôi:

<% if new_messages > 0 %><span class="notification"><%= new_messages %></span><% end %> 
+0

Là một lưu ý phụ, tôi đoán bạn có thể tránh nêu rõ tên. Tôi có nghĩa là, làm '@ message.update_attributes (: read_at => Time.now) nếu @ message.recipient_id == current_user'. Hoặc, đơn giản là '@ message.recipient' nếu bạn có trong mô hình Message' thuộc_to: recipient,: class_name => "User",: foreign_key => "recipient_id" '. Chỉ cần làm một kiểm tra - nếu nó hoạt động, nó trông và đọc đẹp hơn. – prasvin

+0

cảm ơn bạn. tôi đã rất mắc kẹt với một cái gì đó tương tự như thế này. nhiều đạo cụ cho thấy sự tiến bộ của bạn và làm việc code =) tôi đã cố gắng để làm điều này bằng cách sử dụng một thông báo flash và new_messages helper của bạn đã giúp rất nhiều =) – Sasha

Trả lời

2

Làm thế nào về điền vào read_at cột trong hành động hiển thị, nghĩa là chúng tôi có đối tượng trong hành động hiển thị và sau đó cập nhật thuộc tính read_at của nó trước khi redering trang

+0

Nhưng lần đầu tiên đối tượng được hiển thị là sau khi nó được tạo ra phải không? Vì vậy, nếu tôi tạo một tin nhắn, nó cho thấy, và 'read_at' sẽ được lấp đầy bởi tôi. Đúng? Hay không? – tvalent2

+0

hmm, yea cần nhiều suy nghĩ hơn :). Làm thế nào về việc cập nhật read_at thành nil cho những đối tượng yêu cầu thông báo. Vì vậy, read_at đã được lấp đầy ngay sau khi được tạo ra sẽ không đặt ra một vấn đề. Trong khi đó, hãy suy nghĩ về một giải pháp tốt hơn – prasvin

+0

Tôi nghĩ tốt hơn là so sánh cột read_at với cột updated_at. Nếu bạn dự định hiển thị đối tượng ngay sau khi tạo, read_at sẽ được lấp đầy. Nếu đối tượng được cập nhật, một thông báo sẽ được gửi dựa trên cột read_at và updated_at. Hi vọng điêu nay co ich. – prasvin

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