activescaffold / active_scaffold

Save time and headaches, and create a more easily maintainable set of pages, with ActiveScaffold. ActiveScaffold handles all your CRUD (create, read, update, delete) user interface needs, leaving you more time to focus on more challenging (and interesting!) problems.
MIT License
1.09k stars 327 forks source link

Endless (> 15min) loop with large amount of columns and nested scaffold #169

Closed clst closed 11 years ago

clst commented 12 years ago

Hi,

I have a nasty problem: A very large and ugly legacy table:

class Kalkbeschreib < ActiveRecord::Base
  set_primary_key 'Nummer'
  set_table_name 'kalkbeschreib'
end

an embedded scaffold:

#view:
= render :active_scaffold => "user_clock_hlp/kalkbeschreibs"
#controller
class UserClockHlp::KalkbeschreibsController < ApplicationController

  active_scaffold :kalkbeschreib do |config|
    config.create.link=false
    config.show.link=false
    config.update.link=false
    config.delete.link=false

    config.columns = [:KalkNummer, :Pos, :Menge, :Text]

    config.list.sorting = [{:KalkNummer => :desc}, {:Pos => :asc}]

  end

calling the controller like this: /user_clock_hlp/kalkbeschreibs works fine. But when I want to embed the scaffold in the view it hangs the whole rails server and I have to "kill -kill" it as CTRL-C won't work anymore.

Embedding some other scaffold in the same view works fine though.

It is very strange. Can somebody please give some thoughts, I am at a loss.

I am using: Ubuntu 10.04 Rails 3.2.5 Gems included by the bundle:

Here is a debug session where I was trying to figure out what was happening, perhaps it can help a little:

/home/likewise-open/APL/claudius/webdev/aplweb/app/views/user_clock/_as_kalkbeschreib.html.haml:4
= render :active_scaffold => "user_clock_hlp/kalkbeschreibs"
(rdb:1) b core.rb:156
*** No source file named core.rb
Set breakpoint anyway? (y/n) y
Breakpoint 1 file core.rb, line 156
(rdb:1) c
Breakpoint 1 at core.rb:156
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/core.rb:156
action = self.send(action_name)
(rdb:1) l
[151, 160] in /usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/core.rb
   151      def _load_action_columns
   152        #ActiveScaffold::DataStructures::ActionColumns.class_eval {include ActiveScaffold::DataStructures::ActionColumns::AfterConfiguration}
   153  
   154        # then, register the column objects
   155        self.actions.each do |action_name|
=> 156          action = self.send(action_name)
   157          next unless action.respond_to? :columns
   158          action.columns.set_columns(self.columns)
   159        end
   160      end
(rdb:1) actions.count
8
(rdb:1) ps actions
#<ActiveScaffold::DataStructures::Actions:0x0000000554ca68
 @set=[:create, :list, :search, :update, :delete, :show, :nested, :subform]>
(rdb:1) l =
[151, 160] in /usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/core.rb
   151      def _load_action_columns
   152        #ActiveScaffold::DataStructures::ActionColumns.class_eval {include ActiveScaffold::DataStructures::ActionColumns::AfterConfiguration}
   153  
   154        # then, register the column objects
   155        self.actions.each do |action_name|
=> 156          action = self.send(action_name)
   157          next unless action.respond_to? :columns
   158          action.columns.set_columns(self.columns)
   159        end
   160      end
(rdb:1) self.actions.count
8
(rdb:1) c
Breakpoint 1 at core.rb:156
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/core.rb:156
action = self.send(action_name)
(rdb:1) l
[151, 160] in /usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/core.rb
   151      def _load_action_columns
   152        #ActiveScaffold::DataStructures::ActionColumns.class_eval {include ActiveScaffold::DataStructures::ActionColumns::AfterConfiguration}
   153  
   154        # then, register the column objects
   155        self.actions.each do |action_name|
=> 156          action = self.send(action_name)
   157          next unless action.respond_to? :columns
   158          action.columns.set_columns(self.columns)
   159        end
   160      end
(rdb:1) actions.count
8
(rdb:1) n
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/core.rb:157
next unless action.respond_to? :columns
(rdb:1) action.respond_to? :columns
true
(rdb:1) n
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/core.rb:158
action.columns.set_columns(self.columns)
(rdb:1) step
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/list.rb:90
self.columns = @core.columns._inheritable unless @columns # lazy evaluation
(rdb:1) n
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/list.rb:91
@columns
(rdb:1) l
[86, 95] in /usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/list.rb
   86      # ----------------------------
   87  
   88      # provides access to the list of columns specifically meant for the Table to use
   89      def columns
   90        self.columns = @core.columns._inheritable unless @columns # lazy evaluation
=> 91        @columns
   92      end
   93      
   94      public :columns=
   95  
(rdb:1) 
[96, 105] in /usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/list.rb
   96      # how many rows to show at once
   97      attr_accessor :per_page
   98  
   99      # how many page links around current page to show
   100      attr_accessor :page_links_inner_window
   101  
   102      # how many page links around current page to show
   103      attr_accessor :page_links_outer_window
   104      
   105      def page_links_window=(value)
(rdb:1) n
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/data_structures/action_columns.rb:109
@columns = columns
(rdb:1) l
[104, 113] in /usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/data_structures/action_columns.rb
   104          return result
   105        end
   106  
   107        # registers a set of column objects (recursively, for all nested ActionColumns)
   108        def set_columns(columns)
=> 109          @columns = columns
   110          # iterate over @set instead of self to avoid dealing with security queries
   111          @set.each do |item|
   112            item.set_columns(columns) if item.respond_to? :set_columns
   113          end
(rdb:1) n
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/data_structures/action_columns.rb:111
@set.each do |item|
(rdb:1) l
[106, 115] in /usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/data_structures/action_columns.rb
   106  
   107        # registers a set of column objects (recursively, for all nested ActionColumns)
   108        def set_columns(columns)
   109          @columns = columns
   110          # iterate over @set instead of self to avoid dealing with security queries
=> 111          @set.each do |item|
   112            item.set_columns(columns) if item.respond_to? :set_columns
   113          end
   114        end
   115  
(rdb:1) @columns.count
1047
(rdb:1) @set.count
1046
(rdb:1) n
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/data_structures/action_columns.rb:112
item.set_columns(columns) if item.respond_to? :set_columns
(rdb:1) n
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/data_structures/action_columns.rb:112
item.set_columns(columns) if item.respond_to? :set_columns
(rdb:1) fin
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/data_structures/actions.rb:20
@set.each {|item| yield item}
(rdb:1) l
[15, 24] in /usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/data_structures/actions.rb
   15      args.each { |arg| @set << arg.to_sym unless @set.include? arg.to_sym }
   16    end
   17    alias_method :<<, :add
   18  
   19    def each
=> 20      @set.each {|item| yield item}
   21    end
   22  
   23    def include?(val)
   24      super val.to_sym
(rdb:1) fin
Breakpoint 1 at core.rb:156
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/core.rb:156
action = self.send(action_name)
(rdb:1) l
[151, 160] in /usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/core.rb
   151      def _load_action_columns
   152        #ActiveScaffold::DataStructures::ActionColumns.class_eval {include ActiveScaffold::DataStructures::ActionColumns::AfterConfiguration}
   153  
   154        # then, register the column objects
   155        self.actions.each do |action_name|
=> 156          action = self.send(action_name)
   157          next unless action.respond_to? :columns
   158          action.columns.set_columns(self.columns)
   159        end
   160      end
(rdb:1) n
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/core.rb:157
next unless action.respond_to? :columns
(rdb:1) n
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/core.rb:158
action.columns.set_columns(self.columns)
(rdb:1) s
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/search.rb:46
unless @columns
(rdb:1) l
[41, 50] in /usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/search.rb
   41      # ----------------------------
   42  
   43      # provides access to the list of columns specifically meant for the Search to use
   44      def columns
   45        # we want to delay initializing to the @core.columns set for as long as possible. Too soon and .search_sql will not be available to .searchable?
=> 46        unless @columns
   47          self.columns = @core.columns.collect{|c| c.name if @core.columns._inheritable.include?(c.name) and c.searchable? and c.column and c.column.text?}.compact
   48        end
   49        @columns
   50      end
(rdb:1) n
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/active_scaffold-3.2.12/lib/active_scaffold/config/search.rb:47
self.columns = @core.columns.collect{|c| c.name if @core.columns._inheritable.include?(c.name) and c.searchable? and c.column and c.column.text?}.compact
(rdb:1) 
>>HANGS<<
scambra commented 11 years ago

If you have this problem with master branch, reopen and post your table structure. If this error only happen with that table I will need the table to test it