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 #<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>
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
Syndicated 2011-12-01 11:50:00 (Updated 2012-02-05 17:28:21) from Michael's musings