如何判断是否已在Rails中读取某些内容以进行通知

tva*_*nt2 6 ruby-on-rails-3

我想在我的网站上实现一个简单的通知系统,向用户显示一个看不见/未读的项目.类似于Stack Exchange中用于用户收件箱的内容,其中显示了对问题的未读评论等.

我遇到了这个问题,概述了我是如何做到这一点的.我很困惑的是如何弄清楚是否有东西被读过.我可以添加一个read_at列但是如何实际填充它?如果有人能帮我提供一些基本的指导,我会很感激!

更新#1:如果我在我的项目#show action中添加条件,我会检查user_id(创建项目的用户的ID)current_user.id.像下面这样的东西:

unless @item.user_id == current_user.id
  @item.read_at = Time.now
end
Run Code Online (Sandbox Code Playgroud)

更新#2:使用下面的代码,我试图更新消息,read_at如果它recipient_idcurrent_userID 匹配.然而,它不起作用.

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
Run Code Online (Sandbox Code Playgroud)

最后更新:感谢@prasvin,这是我的解决方案.我read_at在对象中添加了一列.该对象还具有现有recipient_id列.所以在我的Controller的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
Run Code Online (Sandbox Code Playgroud)

然后在我的helper.rb文件中:

def new_messages
  Message.where(:recipient_id => current_user.id, :read_at => nil).count
end
Run Code Online (Sandbox Code Playgroud)

在我的布局中:

<% if new_messages > 0 %><span class="notification"><%= new_messages %></span><% end %>
Run Code Online (Sandbox Code Playgroud)

pra*_*vin 3

如何read_at在show action中填写column,即我们在show action中拥有该对象,然后在重新渲染页面之前更新其read_at属性