Запутался, какой Prototype помощник использовать (обновлено) - PullRequest
0 голосов
/ 09 марта 2010

Это продолжение Не понятно, какой помощник 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 в модели, весь закомментированный код был рекомендован к изменениям из предыдущего поста , чтобы сделать эту работу. Но как только я раскомментирую последние три строки из create.rjs и @old_messages = Message.old_messages с контроллера, я даже не смогу отправлять сообщения с частичной message_form. Кто-нибудь может увидеть, что здесь не так? Я просто пытаюсь создать базовое приложение, которое поможет мне лучше понять rails и rjs. Буду очень признателен за любые предложения или исправления, которыми вы хотите поделиться, спасибо за чтение моего поста.

Ответы [ 2 ]

0 голосов
/ 09 марта 2010

проблема в том, что old_messages является методом экземпляра, а вы вызываете из класса.

если вы делаете

def self.old_messages
   # ...
end

теперь это метод класса.

этот блог содержит хорошее объяснение методов класса и экземпляра.

0 голосов
/ 09 марта 2010

это не то, что вы просите, но у меня есть предложение ...

, чтобы получить старые сообщения, которые вы можете использовать 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)
...