Forum: Ruby on Rails Rake aborted! stack level too deep

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
D774d89baf9d27bf526ef587b3593f96?d=identicon&s=25 Valeriya Alex (valeriya)
on 2007-08-02 09:03
Hello,

I have trouble with migration files. Every time when I try create a
record by migration file I have error: "Rake aborted! stack level too
deep"
(look bellow to see content of my migration file and my rails
environment)

This error is very tricky, I do hot sure but sounds like this error
happen
when ruby could not find a method

I found that problem at the two places. One is:
'paginating find' plugin
http://cardboardrocket.com/pages/paginating_find

and second is:
'userstamp' plugin
http://www.delynnberry.com/articles/category/userstamp/

There is code at the paginating find:

  def self.included(base)
    base.extend(ClassMethods)
      base.class_eval do
        class << self
          alias_method_chain :find, :pagination
        end
      end
    end
  .....
    def find_with_pagination(*args)
      options = extract_options_from_args!(args)
      .....
      .....
      .....
        # The :page option was not specified, so invoke the
        # usual AR::Base#find method
        find_without_pagination(*(args << options))
      end
    end

I can see at the log that error happen after when was executed
  -> body of find_with_pagination
    -> call find_without_pagination(*(args << options))
      -> body of find_with_pagination
        -> options = extract_options_from_args!(args)

As I can understand the 'find_without_pagination' method call
executes 'find_with_pagination' instead.

Sounds like alias_method_chain :find, :pagination does not work with
rake
(that is strange, should not be like that).

I fixed the trouble but solution was not great. I have replaced:
  alias_method_chain :find, :pagination

By:
  alias_method :pagination_find, :find_with_pagination
  alias_method :find_without_pagination, :find

And all places where I need a pagination find I use 'pagination_find
method'
and use just 'find' at other cases

Other place which makes error is a userstamp plugin
And here the same trouble

  alias_method :create_without_user, :create
  alias_method :create, :create_with_user
  alias_method :update_without_user, :update
  alias_method :update, :update_with_user

  def create_with_user
    if record_userstamps and user_model.current_user != nil
      write_attribute(:created_by, user_model.current_user.id.to_i) if
respond_to?(:created_by) and self.created_by.nil?
      write_attribute(:updated_by, user_model.current_user.id.to_i) if
respond_to?(:updated_by)
    end
    create_without_user
  end

  class Base
    @@user_model_name = :users
    cattr_accessor :user_model_name

    @@record_userstamps = true
    cattr_accessor :record_userstamps

    def self.relates_to_user_in(model)
      self.user_model_name = model
    end

    def user_model
      Object.const_get(self.user_model_name.to_s.singularize.humanize)
    end
  end

When user_model is
Object.const_get(self.user_model_name.to_s.singularize.humanize)
It has error at the singularize (look at reports bellow)

When I changed code of user_model to just return User the error at the
method create_with_user when it try call create_without_user

Sounds like it can't find create_without_user method. At result there
is same trouble with alias_method and migration as abowe

And last point. The troubles only with rake and no troubles
when application works as web server.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
My migration file

class CreateDefUsers < ActiveRecord::Migration
  def self.up
    User.create( { :id => 1,
      :login => 'root', :password => "root",
:password_confirmation=>"root",
      :email=>"email@email.com", :role =>:root, :company_id=>1 } )

  end
  def self.down
  end
end
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Error message when:

  def user_model
    User
  end

== CreateDefUsers: migrating
==================================================
rake aborted!
stack level too deep
D:/AppFrameWork/RAdmin/config/../vendor/plugins/userstamp/lib/userstamp.rb:32:in
`create_without_user'
D:/AppFrameWork/RAdmin/config/../vendor/plugins/userstamp/lib/userstamp.rb:36:in
`create'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1789:in
`create_or_update_wit
hout_callbacks'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/callbacks.rb:242:in
`create_or_update
'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1545:in
`save_without_validat
ion'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/validations.rb:752:in
`save_without_t
ransactions'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/transactions.rb:129:in
`save'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/abstract/database
_statements.rb:59:in `transaction'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/transactions.rb:95:in
`transaction'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/transactions.rb:121:in
`transaction'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/transactions.rb:129:in
`save'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:451:in
`create'
./db/migrate//014_create_def_users.rb:3:in `real_up'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:212:in
`send'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:212:in
`migrate'
C:/ruby/lib/ruby/1.8/benchmark.rb:293:in `measure'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:212:in
`migrate'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:335:in
`migrate'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:330:in
`each'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:330:in
`migrate'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:297:in
`up'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:288:in
`migrate'
C:/ruby/lib/ruby/gems/1.8/gems/rails-1.2.3/lib/tasks/databases.rake:4
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:392:in `call'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:392:in `execute'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:392:in `each'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:392:in `execute'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:362:in `invoke'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:355:in
`synchronize'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:355:in `invoke'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1739:in
`top_level'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1739:in `each'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1739:in
`top_level'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1761:in
`standard_exception_handling'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1733:in
`top_level'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1711:in `run'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1761:in
`standard_exception_handling'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1708:in `run'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/bin/rake:7
C:/ruby/bin/rake.bat:20:in `load'
C:/ruby/bin/rake.bat:20

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Error message when:

  def user_model
    Object.const_get(self.user_model_name.to_s.singularize.humanize)
  end


== CreateDefUsers: migrating
==================================================
rake aborted!
stack level too deep
C:/ruby/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/inflector.rb:120:in
`singularize'
C:/ruby/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/core_ext/string/inflections.rb:33:in
 `singularize'
D:/AppFrameWork/RAdmin/config/../vendor/plugins/userstamp/lib/userstamp.rb:65:in
`user_model'
D:/AppFrameWork/RAdmin/config/../vendor/plugins/userstamp/lib/userstamp.rb:32:in
`create_without_user'
D:/AppFrameWork/RAdmin/config/../vendor/plugins/userstamp/lib/userstamp.rb:36:in
`create'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1789:in
`create_or_update_wit
hout_callbacks'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/callbacks.rb:242:in
`create_or_update
'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1545:in
`save_without_validat
ion'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/validations.rb:752:in
`save_without_t
ransactions'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/transactions.rb:129:in
`save'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/abstract/database
_statements.rb:59:in `transaction'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/transactions.rb:95:in
`transaction'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/transactions.rb:121:in
`transaction'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/transactions.rb:129:in
`save'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:451:in
`create'
./db/migrate//014_create_def_users.rb:3:in `real_up'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:212:in
`send'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:212:in
`migrate'
C:/ruby/lib/ruby/1.8/benchmark.rb:293:in `measure'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:212:in
`migrate'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:335:in
`migrate'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:330:in
`each'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:330:in
`migrate'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:297:in
`up'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/migration.rb:288:in
`migrate'
C:/ruby/lib/ruby/gems/1.8/gems/rails-1.2.3/lib/tasks/databases.rake:4
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:392:in `call'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:392:in `execute'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:392:in `each'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:392:in `execute'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:362:in `invoke'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:355:in
`synchronize'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:355:in `invoke'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1739:in
`top_level'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1739:in `each'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1739:in
`top_level'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1761:in
`standard_exception_handling'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1733:in
`top_level'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1711:in `run'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1761:in
`standard_exception_handling'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1708:in `run'
C:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.3/bin/rake:7
C:/ruby/bin/rake.bat:20:in `load'
C:/ruby/bin/rake.bat:20
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
My Rails Enviroment

Windows XP SP2
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
rails-1.2.3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
D774d89baf9d27bf526ef587b3593f96?d=identicon&s=25 Valeriya Alex (valeriya)
on 2007-08-02 12:21
Hmmm, my message was not clear... I want give few important comments

>Other place which makes error is a userstamp plugin
>And here the same trouble

Next going the code of userstamp plugin

>  alias_method :create_without_user, :create
>  alias_method :create, :create_with_user
>  alias_method :update_without_user, :update
>  alias_method :update, :update_with_user

Other thing

>Error message when:
>  def user_model
>    User
>  end

I mean that the user stamp has the method 'user_model' which is actualy
different and make error also (what is also I need to understand), but I
replace that code to this simple variant:

Also when error log has next lines at the top of log:

rake aborted! stack level too deep
D:/AppFrameWork/RAdmin/config/../vendor/plugins/userstamp/lib/userstamp.rb:32:in
`create_without_user'
D:/AppFrameWork/RAdmin/config/../vendor/plugins/userstamp/lib/userstamp.rb:36:in

The source code had linenumbers

31    def create_with_user
32      if record_userstamps and user_model.current_user != nil
33        write_attribute(:created_by, user_model.current_user.id.to_i)
if respond_to?(:created_by) and self.created_by.nil?
34        write_attribute(:updated_by, user_model.current_user.id.to_i)
if respond_to?(:updated_by)
35      end
36      create_without_user
37    end

Function call order is:
  -> create_with_user
    -> create_without_user
      -> create_with_user

So stack overflowed cause the function calls byself.
D774d89baf9d27bf526ef587b3593f96?d=identicon&s=25 Valeriya Alex (valeriya)
on 2007-08-02 17:25
D774d89baf9d27bf526ef587b3593f96?d=identicon&s=25 Valeriya Alex (valeriya)
on 2007-08-03 09:01
Valeriya Alex wrote:
> I found similar trouble here
> http://wrath.rubyonrails.org/pipermail/rails/2006-...

As result, I have recoded plug-ins source with inheritance. And I will
avoid of using class extending with 'alias_method'
This topic is locked and can not be replied to.