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_id
current_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 %>
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
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