对于使用哪种Prototype助手感到困惑

时间:2010-03-07 20:38:04

标签: ruby-on-rails ruby ajax prototypejs rjs

阅读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将新消息添加到列表顶部。 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会有所帮助吗?

2 个答案:

答案 0 :(得分: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中删除的行为。

答案 1 :(得分:0)

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

  1. 将“已删除的消息”作为AR哈希数组或仅ID
  2. 返回
  3. 为HTML元素ID
  4. 中ID为AR对象的每条消息呈现HTML元素
  5. 使用ID标识表单上的HTML元素,并替换为空白HTML元素
  6. 你有一个有效的解决方案。我希望这会有所帮助。