web-dev-qa-db-ja.com

Rails3 beta4モデルで「SystemStackError:スタックレベルが深すぎます」と表示されるのはなぜですか

次のエラーが発生します:SystemStackError: stack level too deepの下のRails3 beta4で次のコードを実行するとRuby 1.9.2-rc1

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 > 

そしてそれは次のコードによって引き起こされます:

# 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

どうしたの。少し調べてみましたが、誰も同じ問題を抱えているようには見えません。同じRubyバージョンではないため、workflow.rbファイルが異なるか、stack level to deepが別の原因で発生しています。

どんな助けでも大いに感謝されます!

宜しくお願いします

//エミル

17
Ekampp

メソッド自体で同じメソッドを呼び出しています

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

同じmethod namecolumn nameがあり、問題の原因でメソッド名を変更していると思います。

  def check_forum_type_changed?
    self.forum_type_changed?  #method name and column name are different
  end
38
Salil