2010-03-09 3 views
0

Ceci est la suite de Confused as to which Prototype helper to use. Mon code a été mis à jour pour tenir compte des suggestions d'autres utilisateurs:Confus quant à l'aide de Prototype à utiliser (mise à jour)

(modèle) 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 

(vue) index.html.erb:

<div id="messages"> 
    <%= render :partial => @messages %> 
</div> 
<%= render :partial => "message_form" %> 

(vue) _message. html.erb:

<% div_for message do %> 
    <%= h message.created_at.strftime("%X") %> - <%= h message.author %><%= h message.message %> 
<% end %> 

(vue) _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 %> 

(voir) 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 

(contrôleur) messages_controller.rb: Méthode

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 

A l'exception de la old_messages de dans le modèle, la totalité du code commenté étaient modifications recommandées à partir du previous post pour faire ce travail. Mais dès que je décommente les trois dernières lignes de create.rjs et @old_messages = Message.old_messages du contrôleur, je ne peux même pas soumettre de messages avec le message_form partial. Quelqu'un peut-il voir ce qui ne va pas ici? J'essaie juste de créer une application basique pour aider à mieux comprendre les rails et les rjs. J'apprécierais grandement toutes les suggestions ou corrections que vous avez à partager, merci d'avoir lu mon article.

+0

pourriez-vous s'il vous plaît nous dire quelle erreur obtenez-vous? –

+0

Paramètres: {"authenticity_token" => "srg8coKfA7j/Boy1zMPMs9BTonQ4 + 5sPlGpfo/McKzI =", "message" => {"message" => "veuillez travailler!"}, "Submit_btn" => "submit"} SQL (0.3ms) SELECT nom dE sqlite_master WHERE type = 'table' AND NOT name = 'sqlite_sequence' NoMethodError (méthode non définie old_messages' pour # ): app/controllers/messages_controller.rb: 18 : dans 'créer ' C'est avec le code ci-dessus décommenté. – BasicObject

Répondre

0

ce n'est pas ce que vous demandez, mais j'ai une suggestion ...

pour obtenir les messages plus anciens, vous pouvez utiliser named_scope.

dans votre cas, (si je comprends ce que vous voulez) Je pense que ce serait quelque chose comme:

# model 
named_scope :limit, lambda { |num| { :limit => num } } 
named_scope :order, lambda { |ord| { :order => ord } } 

et

#controller 
Message.order("updated_at DESC").limit(24) 
0

le problème est que old_messages est une méthode d'instance, et vous appelez d'une classe.

si vous

def self.old_messages 
    # ... 
end 

il est maintenant une méthode de classe.

this blog a une bonne explication sur les méthodes de classe et d'instance.

+0

Merci pour votre réponse.Le formulaire fonctionne à nouveau avec l'ajout des messages via rjs/ajax. Mais ce qui suit dans create.rjs ne semble pas faire ce à quoi je m'attends: @ old_messages.each do | m | page.remove (m.id) fin À mesure que les messages sont ajoutés à la liste, je souhaite que ceux qui sont supprimés par le modèle soient également supprimés via rjs dans la vue sous forme de message_form. Un utilisateur dans mon post précédent a suggéré que le code ci-dessus fonctionnerait. Cela me semble correct. J'ai essayé de réordonner mon create.rjs mais cela ne change pas le comportement. – BasicObject

+0

Il semble que le code ne soit pas formaté dans les boîtes de commentaires. Si c'est difficile à lire, le code gênant est les trois dernières lignes de create.rjs ci-dessus (dans sa forme non commentée bien sûr) – BasicObject

+0

je ne suis pas sûr si je comprends. Lorsque vous ajoutez un nouveau message et que vous êtes redirigé vers la liste des messages, les anciens sont-ils toujours affichés? –