Active Scaffold obscures internal errors

In a newly scaffold’ed model and controller, created with ActiveScaffold 3.0.5, on rails 3.0.9, I was getting errors from the default created rspec code that I could not diagnose:

1) Admin::ConnectionsController POST create with valid params creates a new Connection Failure/Error: post :create, :connection => valid_attributes NoMethodError: You have a nil object when you didn't expect it! You might have expected an instance of Array. The error occurred while evaluating nil.each # ./spec/controllers/admin/connections_controller_spec.rb:54

Worse, these things were working just fine in RAILS_ENV=development.

Well, of course, it is failing on the line where the :create is invoked. But, where is the nil.each occuring?

I ran things with:

bundle exec rspec -d spec/controllers/admin/connections_controller_spec.rb \ -e "POST create with valid params creates a new Connection"

after putting “debugger” in before the test case:

describe "POST create" do describe "with valid params" do it "creates a new Connection" do # expect { debugger post :create, :connection => valid_attributes #}.to change(Connection, :count).by(1) end

(I’m still looking for a good ruby-debug mode that works like gdb-mode in Emacs works, that can show me the code around where I am…)

One winds up in the rescue in:

/var/lib/gems/1.8/gems/actionpack-3.0.9/lib/action_controller/metal/rescue.rb

on line 19.

So, stick a breakpoint on the super there:

break /var/lib/gems/1.8/gems/actionpack-3.0.9/lib/action_controller/metal/rescue.rb:17

This lets you see the exception:

(rdb:1) p exception You might have expected an instance of Array. The error occurred while evaluating nil.each>

The annoying part is that the action is invoked at /var/lib/gems/1.8/gems/actionpack-3.0.9/lib/action_controller/metal/instrumentation.rb:29

ActiveSupport::Notifications.instrument("process_action.action_controller", raw_payload) do |payload|

so, it evaluates code, and there are in fact one block passed to another block, and it seems really hard (a major ruby-debug limitation), that I can not put a breakpoint easily into the beginning of a block passed in.

I had to resort to editing that file, and sticking “debugger” in there!

Finally, one gets to:

/var/lib/gems/1.8/gems/actionpack-3.0.9/lib/abstract_controller/base.rb:150 send_action(method_name, *args)

In the debugger, the right thing to do is:

catch NoMethodError

This finally shows me that the failure is at:

/corp/projects/credil/hydra/t3041/vendor/plugins/active_scaffold/lib/active_scaffold/attribute_params.rb:42

Why? Because attributes is nil.

Why, because the generated controllers spec file says:

describe "with valid params" do it "creates a new Connection" do expect { post :create, :connection => valid_attributes }.to change(Connection, :count).by(1) end

should have been generated as:

describe "with valid params" do it "creates a new Connection" do expect { post :create, :record => valid_attributes }.to change(Connection, :count).by(1) end