阅读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会有所帮助吗?
答案 0 :(得分:1)
我会假设你的message
部分在渲染后看起来像这样:
<div id='message_123'>
<h3>Message Header</h3>
<p>This is the body of the message</h3>
</div>
如果不是这种情况,请更改它。每条消息都应包含在div
或span
中,其中包含该消息的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)
也许这些步骤可以提供帮助。
你有一个有效的解决方案。我希望这会有所帮助。