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