Forum: Ruby on Rails Rspec: How to test create action in controller

Posted by Peter (Guest)
on 2013-01-13 16:05
(Received via mailing list)
Hi Everyone,

(using rails 3.2.11)

I've searched high and low for the answer to this, so now I have to 
submit
a question...

      # describe "POST on Users#create" do
>       #   before { post users_path }
>       #   specify { response.should redirect_to(root_path) }
>       # end


Every time I run rspec with that test, I get this:

     Failure/Error: before { post users_path }
>      AbstractController::DoubleRenderError:
>        Render and/or redirect were called multiple times in this action.
> Please note that you may only call render OR redirect, and at most once per
> action. Also note that neither redirect nor render terminate execution of
> the action, so if you want to exit an action after redirecting, you need to
> do something like "redirect_to(...) and return".


What am I doing wrong? Thank you.
Posted by Jordon Bedwell (Guest)
on 2013-01-13 16:18
(Received via mailing list)
On Sun, Jan 13, 2013 at 5:23 AM, Peter <peter@poproj.com> wrote:
>
>>      Failure/Error: before { post users_path }
>>      AbstractController::DoubleRenderError:
>>        Render and/or redirect were called multiple times in this action.
>> Please note that you may only call render OR redirect, and at most once per
>> action. Also note that neither redirect nor render terminate execution of
>> the action, so if you want to exit an action after redirecting, you need to
>> do something like "redirect_to(...) and return".
>
>
> What am I doing wrong? Thank you.

Renders and redirects in Rails do not trigger a halt on the http stack
so you need to trigger the halt yourself inside of the action by using
"return render :blah" in your if or "return redirect_to :back".  What
I am saying is if you have a conditional and you render and then have
another render it will trigger a double render because it does not
halt the http and render or redirect, it continues to let you finish
your job if you need to... such as closing off connections and
what-have-you.  An example:

MyController < ApplicationController
  def my_action
     redirect_to :back unless params["blah"] == "blah"
     render :my_template
  end
end

Should be:

MyController < ApplicationController
  def my_action
     return redirect_to :back unless params["blah"] == "blah"
     render :my_template
  end
end
Posted by Jordon Bedwell (Guest)
on 2013-01-13 16:21
(Received via mailing list)
On Sun, Jan 13, 2013 at 9:17 AM, Jordon Bedwell <envygeeks@gmail.com> 
wrote:
>   def my_action
>      return redirect_to :back unless params["blah"] == "blah"
>      render :my_template
>   end
> end

To add before somebody points it out, I would never personally write a
simple method like that, I would instead prefer to do something like:

MyController < ApplicationController
  def my_action
    prams["blah"] == "blah" ? render(:my_template) : redirect_to(:back)
  end
end
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.