2010-07-17 12 views
16

sto ottenendo il seguente errore: SystemStackError: stack level too deep quando si esegue il seguente codice nel rails3 beta4 sotto ruby 1.9.2-rc1:Perché ricevo un "SystemStackError: livello di stack troppo in profondità" nel mio Rails3 beta4 modello

ruby-1.9.2-rc1 > f = Forum.all.first 
    => #<Forum id: 1, title: "Forum 1", description: "Description 1", content: "Content 1", parent_id: nil, user_id: 1, forum_type: "forum", created_at: "2010-07-17 04:39:41", updated_at: "2010-07-17 04:39:41", icon_file_name: nil, icon_content_type: nil, icon_file_size: nil, icon_updated_at: nil> 
ruby-1.9.2-rc1 > f.children 
    => [#<Forum id: 2, title: "Thread 2", description: "Description 2", content: "Content 2", parent_id: 1, user_id: 1, forum_type: "thread", created_at: "2010-07-17 04:40:17", updated_at: "2010-07-17 04:40:17", icon_file_name: nil, icon_content_type: nil, icon_file_size: nil, icon_updated_at: nil>] 
ruby-1.9.2-rc1 > f.forum_type = "thread" 
    => "thread" 
ruby-1.9.2-rc1 > f.save 
SystemStackError: stack level too deep 
from /Users/emilkampp/.rvm/rubies/ruby-1.9.2-rc1/lib/ruby/1.9.1/irb/workspace.rb:80 
Maybe IRB bug!! 
ruby-1.9.2-rc1 > 

E questo è causato dal seguente codice:

# Before and after filters 
# 
before_update :update_all_nested_objects, :if => :forum_type_changed? 

protected 
    # Checks if the +forum_type+ has been changed 
    # 
    def forum_type_changed? 
    self.forum_type_changed? 
    end 

    # Updates all nested upjects if the +forum_type+ has been changed 
    # 
    # This will trigger the +update_all_nested_objects+ method on all touched children, thus 
    # starting a chain-reaction all the way through the forum-tree. 
    # 
    # NOTE: This is where the error is triggered, since this is the only non-tested looping code, and my test- 
    #  cases hasn't changed since this was added. 
    # 
    def update_all_nested_objects 
    children.each do |child| 
     child.forum_type = child_type 
     child.save 
    end 
    end 

Quindi, cosa sta succedendo. Ho controllato un po ', ma nessuno sembra avere lo stesso problema. O non è la stessa versione rubino, quindi il file workflow.rb è diverso, oppure lo stack level to deep è causato da qualcos'altro.

Qualsiasi aiuto sarà molto apprezzato!

migliori saluti

// Emil

risposta

33

Si sta chiamando stesso metodo nel metodo stesso

def forum_type_changed? 
    self.forum_type_changed? #This will never ending process hence it gives error 
    end 

Credo che bisogna stessa method name e column name che causano problemi cambiare il nome del metodo, allora

def check_forum_type_changed? 
    self.forum_type_changed? #method name and column name are different 
    end 
Problemi correlati