2010-03-09 37 views
0

這是Confused as to which Prototype helper to use的延續。我的代碼已被更新,以反映其他用戶的建議:混淆使用哪個Prototype助手(更新)

(模型)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 

(控制器)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

請問您能告訴我們哪個錯誤? – 2010-03-09 19:00:45

+0

參數:{「authenticity_token」=>「srg8coKfA7j/Boy1zMPMs9BTonQ4 + 5sPlGpfo/McKzI =」,「message」=> {「message」=>「please work!」},「submit_btn」=>「submit」} SQL 0.3ms的)SELECT姓名FROM SQLITE_MASTER WHERE類型= '表' AND NOT名稱= sqlite_sequence' NoMethodError(未定義的方法'old_messages'爲#<類別:0x7ffaaefdf9e8>): 應用程序/控制器/ messages_controller.rb:18 :在'創建' 這與上面的代碼未註釋。 – BasicObject 2010-03-09 19:22:12

回答

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) 
0

問題是old_messages是實例方法,以及你是從一個班級打電話來的。

如果你

def self.old_messages 
    # ... 
end 

它現在是一個類的方法。

this博客對類和實例方法有很好的解釋。

+0

謝謝你的回答。現在,表單再次通過rjs/ajax添加消息。但在create.rjs中的以下內容似乎沒有達到我期望的效果: @ old_messages.each do | m |當消息被添加到列表中時,我希望那些被模型刪除的消息在message_form被提交時也通過視圖中的rjs被刪除。我以前的帖子中的一位用戶建議上面的代碼可以工作。它看起來對我是正確的。我嘗試重新排序我的create.rjs,但它不會改變行爲。 – BasicObject 2010-03-09 21:51:04

+0

看起來代碼未在評論框中格式化。如果難以閱讀,那麼麻煩的代碼就是上面的create.rjs的最後三行(當然它是未註釋的形式) – BasicObject 2010-03-09 21:53:21

+0

我不確定我是否理解。當你添加一條新消息並重定向到消息列表時,是否仍舊顯示舊消息? – 2010-03-10 11:20:28