Integration test not calling destroy


I’m writing to describe a problem I ran into, and the solution, which
I’ve already found, for posterity’s sake, b/c it took a very long time
to figure out. While I don’t consider myself a rails newbie, this does
qualify as a rookie mistake.

I was having an integration test fail because its call to my one of my
app’s destroy controller methods did not appear to be firing. Along
the way, I tried renaming destroy to destroy2, and that “solved” the
problem. Except it failed to explain the actual problem.

It turned out that I was mistakenly using ‘get’ instead of ‘post’ in
the integration test to trigger the method.

For those of you that haven’t run into this yet, the reason this was a
problem is that magic line that scaffolding puts into every
controller, that looks like this:

verify :method => :post, :only => [ :destroy, :create, :update ],
:redirect_to => { :action => :list }

This traps non-post HTTP calls to the listed actions, and redirects
them to a safe action. The purpose of this is to make sure that
(hopefully) all GET requests are non-destructive. This, as you
probably do already know, is to make sure that web crawlers (e.g.
search engines) don’t accidentally modify your databases.

In my case, the reason I was using get was that I was equating it to a
simple hyperlink in one of my templates, rather than a submit button
on a form. However, the hyperlink in question was also generated by
scaffold, and it (correctly) had :method => :post set, for exactly the
same reason.

Of course scaffolding can’t predict what other destructive methods you
might write; technically, you ought to add any destructive method to
this list, and then only call it via a post. I can’t wait to find out
how many places I’ve failed to do that…

HTH someone…


“In the beginning, there was nothing. And God said: ‘Let there be
light!’ And then there was still nothing, but you could see it.”

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs