2010-03-07 40 views
2

看完之後http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html我似乎無法找到我要找的東西。我的郵件列表到達24之後刪除最早的消息,一個簡單的模型,該模型是這樣的簡單:困惑於哪個Prototype幫手使用

class Message < ActiveRecord::Base 
    after_create :destroy_old_messages 
    protected 
    def destroy_old_messages 
    messages = Message.all(:order => 'updated_at DESC') 
    messages[24..-1].each {|p| p.destroy } if messages.size >= 24 
    end 
end 

存在被用於添加新郵件的郵件列表下面的消息的形式。 我正在使用Prototype/RJS將新消息添加到列表頂部。 create.rjs:

page.insert_html :top, :messages, :partial => @message 
page[@message].visual_effect :grow 
#page[dom_id(@messages)].replace :partial => @message 
page[:message_form].reset 

我index.html.erb很簡單:

<div id="messages"> 
    <%= render :partial => @messages %> 
</div> 
<%= render :partial => "message_form" %> 

當有新郵件添加他們出現就好了,但是當24日消息限制已經剛剛達到它不斷添加消息並且不刪除舊消息。理想情況下,我希望他們淡出,因爲新的添加,但他們可以消失。 create.rjs中的註釋行實際上起作用,它刪除了過期的消息,但添加新消息時我失去了視覺效果。有沒有人有建議如何完成添加和從這個簡單的列表中刪除消息與兩個效果?幫助將不勝感激。謝謝閱讀。 P.S .:會periodic_call_remote在這種情況下有幫助嗎?

+0

問題是消息未從數據庫中刪除,或者消息在AJAX請求期間沒有從DOM中刪除? – 2010-03-07 20:41:17

+0

他們正在從數據庫中刪除,我不能讓他們消失,因爲新的消息被添加。我只想要一次顯示24條消息。所以當一個消息添加到ajax時,底部最舊的消息也應該用ajax去除。我一直在看的源代碼是和我喜歡google的rjs cheatsheet pdf。他們並不完全有幫助。感謝您的快速響應順便說一句。 – BasicObject 2010-03-07 21:09:35

回答

1

我會假設你message部分看起來像這樣一旦它被渲染:

<div id='message_123'> 
    <h3>Message Header</h3> 
    <p>This is the body of the message</h3> 
</div> 

如果不是這種情況,改變它原來是這樣。每條消息都應該包含在divspan中,該消息中包含該消息的ID。然後,你可以在下面的方法添加到您Message型號:

def old_messages 
    messages = Message.all(:order => 'updated_at DESC') 
    if messages.size >= 24 
    return messages[24..-1] 
    else 
    return [] 
    end 
end 

然後,在響應該請求的動作,只需添加一行:

@old_messages = Message.old_messages 

,改變你的RJS是:

page.insert_html :top, :messages, :partial => @message 
page[@message].visual_effect :grow 
#page[dom_id(@messages)].replace :partial => @message 
page[:message_form].reset 
@old_messages.each do |m| 
    page.remove(m.id) 
end 

您可以看到我正在使用rails remove方法來完成將不需要的消息從DOM中取出的操作。

+0

這是正確的方法:某些東西需要顯式淡出或刪除現在刪除的消息的DOM元素。儘管答案中有幾個錯別字。 'messages.zie'應該是第一個Ruby塊中的'messages.size'。在RJS中,有一個'}','|'應該關閉'@ old_messages.each'的塊參數列表。 – 2010-03-12 21:12:05

+0

感謝您指出Steve的這些缺陷。我寫這些時一定很累。 – 2010-03-13 00:52:06

0

也許這些步驟可以幫助。

  1. 返回「已刪除消息」作爲AR的陣列散列或只是標識
  2. 渲染用於HTML元素的ID
  3. 使用的ID與AR對象的ID的每個消息,以確定所述的HTML元素HTML表單上的元素並替換爲空白HTML元素

而且您有一個工作解決方案。我希望這有幫助。