Я хотел бы реализовать простую систему уведомлений на моем сайте, где непросмотренный/непрочитанный элемент отображается пользователю. Подобно той, что используется на Stack Exchange для входящих сообщений пользователя, где отображаются непрочитанные комментарии к вопросам и т.д.
Я наткнулся на этот вопрос, в котором представлен обзор того, как это сделать. Меня смущает то, как определить, было ли что-то прочитано. Я могу добавить колонку read_at
, но как ее заполнить? Если кто-нибудь может помочь мне с основным руководством, я буду очень признателен!
UPDATE #1: Что если я добавлю условие к моему действию Item#show, где я проверю user_id
(ID пользователя, создающего элемент) против current_user.id
. Что-то вроде следующего:
unless @item.user_id == current_user.id
@item.read_at = Time.now
end
UPDATE #2: Используя приведенный ниже код, я пытаюсь обновить read_at
сообщения, если его recipient_id
совпадает с current_user
ID. Однако это не работает.
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
Окончательное обновление: Благодаря @prasvin, вот мое решение. Я добавил колонку read_at
к объекту. Объект также имеет существующую колонку recipient_id
. Поэтому в действии show моего контроллера я поместил следующее:
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
Затем в файле helper.rb:
def new_messages
Message.where(:recipient_id => current_user.id, :read_at => nil).count
end
И в моем layout:
<% if new_messages > 0 %><%= new_messages %><% end %>