2012-02-07 64 views
6

我想在我的网站上实现一个简单的通知系统,其中向用户显示看不见/未读的项目。与Stack Exchange中用于用户收件箱的问题类似,其中显示了对问题的未读评论等。如何判断是否在Rails中读取了通知

我遇到了this question,它提供了我如何做到这一点的概述。我感到困惑的是如何弄清楚是否有东西被读取。我可以添加一个read_at列,但我该如何填写它?如果有人能够帮助我一些基本的指导,我会很感激!

更新#1:如果我加一个条件,以我的项目#show动作,我对证current_user.iduser_id(用户在创建项目的ID)。喜欢的东西下面:

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

更新#2:使用下面的代码,我试图更新消息的read_at如果recipient_idcurrent_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列。所以在我的控制器的表演动作,我把以下内容:

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 

而且在我的布局:

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

作为一个方面说明,我想你可以避免明确说明id。我的意思是,做@ message.update_attributes(:read_at => Time.now)if @ message.recipient_id == current_user'。或者,如果你在Message model'belongs_to:recipient,:class_name =>“User”,:foreign_key =>“recipient_id”'中,只需'@ message.recipient'。只要做一个检查 - 如果它的工作,它看起来更好看。 – prasvin 2012-02-16 05:56:06

+0

谢谢。我非常喜欢与此类似的东西。很多道具显示你的进度和工作代码=)我试图做到这一点使用Flash通知和你的new_messages帮手帮了很多=) – Sasha 2012-04-24 00:07:38

回答

2

如何填补read_at column show action,即我们在show action中有对象,然后在重写页面之前更新它的read_at属性

+0

但是,第一次显示的对象是它创建后的权利?所以如果我创建一条消息,它会显示出来,'read_at'将由我填充。对?或没有? – tvalent2 2012-02-07 03:25:58

+0

嗯,是需要更多思考:)。如何将read_at更新为需要通知的对象为零。所以刚刚创建的read_at就不会造成问题。同时,让我想到一个更好的解决方案 – prasvin 2012-02-07 03:36:57

+0

我认为最好将read_at列与updated_at列进行比较。如果您打算在创建后立即显示对象,则会填充read_at。如果对象更新,则会根据read_at和updated_at列发送通知。希望这可以帮助。 – prasvin 2012-02-07 03:53:17

相关问题