这是Confused as to which Prototype helper to use的延续。我的代码已更新,以反映其他用户的建议:
(model)message.rb:
class Message < ActiveRecord::Base
after_create :destroy_old_messages
def old_messages
messages = Message.all(:order => 'updated_at DESC')
if messages.size >= 24
return messages[24..-1]
else
return []
end
end
protected # works without 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
(查看)index.html.erb:
<div id="messages">
<%= render :partial => @messages %>
</div>
<%= render :partial => "message_form" %>
(查看)_message.html.erb:
<% div_for message do %>
<%= h message.created_at.strftime("%X") %> - <%= h message.author %><%= h message.message %>
<% end %>
(查看)_message_form.html.erb:
<% remote_form_for :message, :url => { :action => "create" }, :html => { :id => 'message_form'} do |f| %>
<%= f.text_area :message, :size => "44x3" %><br />
<%= submit_to_remote 'submit_btn', 'submit', :url => { :action => 'create' } %><br />
<% end %>
(查看)create.rjs:
page.insert_html :top, :messages, :partial => @message
page[@message].visual_effect :grow
page[:message_form].reset
flash[:notice]
flash.discard
# @old_messages.each do |m|
# page.remove(m.id)
# end
(controller)messages_controller.rb:
class MessagesController < ApplicationController
def index
@messages = Message.all(:order => "created_at DESC")
respond_to do |format|
format.html
format.js
end
end
def new
@message = Message.new
respond_to do |format|
format.html
end
end
def create
@message = Message.new(params[:message])
# @old_messages = Message.old_messages
respond_to do |format|
if @message.save
flash[:notice] = 'message created.'
format.html { redirect_to(messages_url) }
format.js
else
format.html { render :action => "new" }
end
end
end
def update
@message = Message.find(params[:id])
respond_to do |format|
if @message.update_attributes(params[:message])
flash[:notice] = 'message updated.'
format.html { redirect_to(messages_url) }
format.js
else
format.html { render :action => "edit" }
end
end
end
def destroy
@message = Message.find(params[:id])
@message.destroy
respond_to do |format|
format.html { redirect_to(messages_url) }
format.js
end
end
end
除了模型中的old_messages方法之外,所有注释的代码都是来自previous post的推荐更改,以使其工作。但是一旦我从控制器取消注释create.rjs和@old_messages = Message.old_messages的最后三行,我甚至无法提交message_form部分的消息。有谁能看到这里有什么问题?我只是想创建一个基本的应用程序,以帮助我进一步了解rails和rjs。我非常感谢您分享的任何建议或更正,感谢您阅读我的帖子。
答案 0 :(得分:0)
这不是你要求的,但我有一个建议......
获取较旧的消息,您可以使用named_scope。
在你的情况下,(如果我理解你想要的)我认为它会是这样的:
# model
named_scope :limit, lambda { |num| { :limit => num } }
named_scope :order, lambda { |ord| { :order => ord } }
和
#controller
Message.order("updated_at DESC").limit(24)
答案 1 :(得分:0)
问题是old_messages
是一个实例方法,而你是从一个类调用的。
如果你这样做
def self.old_messages
# ...
end
它现在是一种类方法。
this博客对类和实例方法有很好的解释。