2

阅读http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html后,我似乎找不到我要找的东西。我有一个简单的模型,在消息列表达到 24 条后删除最旧的消息,模型就是这么简单:

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 将新消息添加到列表顶部。创建.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 中的注释行实际上有效,它删除了过期的消息,但在添加新消息时我失去了视觉效果。有没有人对如何完成从这个简单的列表中添加和删除消息以及对两者都有影响的建议?帮助将不胜感激。谢谢阅读。PS:periodic_call_remote 在这种情况下会有所帮助吗?

4

2 回答 2

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 中取出的操作。

于 2010-03-08T02:05:07.057 回答
0

也许这些步骤可以提供帮助。

  1. 将“已删除消息”作为 AR 哈希数组或仅返回 ID
  2. 在 HTML 元素的 ID 中为每条带有 AR 对象 ID 的消息渲染 HTML 元素
  3. 使用 ID 标识表单上的 HTML 元素并替换为空白 HTML 元素

你有一个可行的解决方案。我希望这有帮助。

于 2010-03-12T12:00:40.140 回答