2012-02-07 66 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

相關問題