Как определить, что что-то было прочитано в Rails для уведомления

Я хотел бы реализовать простую систему уведомлений на моем сайте, где непросмотренный/непрочитанный элемент отображается пользователю. Подобно той, что используется на 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 %>

6
задан Community 23 May 2017 в 12:09
поделиться