redirect_to not working

Hi... I have a basic authentication system. I have a RESTful resource called session with the following code when logging in:

  def new   end

  def create     user = User.authenticate(params[:username], params[:password])

    respond_to do |format|       if user         session[:user_id] = user.id         flash[:notice] = "Welcome back #{user.name}!"         format.html {redirect_to (:controller => 'welcome')}       else         flash[:error] = "The username and/or password is invalid!"         format.html { render :action => :new }         format.js       end     end   end

when logging in I get the following in the console:

Processing SessionsController#create (for 127.0.0.1 at 2008-07-01 09:58:03) [POST]   Session ID: BAh7BzoMY3NyZl9pZCIlYjA3ZGQwMTVmZGU0YWQwMzZiY2U5MGRkODM2YThl YTciCmZsYXNoSUM6J0FjdGlvbkNvbnRyb2xsZXI6OkZsYXNoOjpGbGFzaEhh c2h7AAY6CkB1c2VkewA=--7162c9867e535bbfe83e6de00ed23348f1c58c25   Parameters: {"commit"=>"Log in", "action"=>"create", "authenticity_token"=>"ccb053521b704dcd80842248e30717f8ecf1cb27", "username"=>"nateleavitt", "controller"=>"sessions", "password"=>"[FILTERED]"}   User Columns (0.003677) SHOW FIELDS FROM `users`   User Load (0.002006) SELECT * FROM `users` WHERE (`users`.`username` = 'nateleavitt' AND `users`.`password` = 'd3b13af68983849e6d7e944bde7d02fffc38bf2a62a9d7f75d025a62a1af67d6') LIMIT 1 Redirected to http://localhost:3000/welcome Completed in 0.04638 (21 reqs/sec) | DB: 0.00568 (12%) | 302 Found [http://localhost/session\]

Processing WelcomeController#index (for 127.0.0.1 at 2008-07-01 09:58:03) [GET]   Session ID: BAh7CDoMY3NyZl9pZCIlYjA3ZGQwMTVmZGU0YWQwMzZiY2U5MGRkODM2YThl YTc6DHVzZXJfaWRpBiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxh c2g6OkZsYXNoSGFzaHsGOgtub3RpY2UiIVdlbGNvbWUgYmFjayBOYXRoYW4g TGVhdml0dCEGOgpAdXNlZHsGOwhG--2ad40b26ad78c3a7aec22ae0d05b647e64a9d16e   Parameters: {"action"=>"index", "controller"=>"welcome"} Rendering template within layouts/application Rendering welcome/index Rendered shared/_tabs (0.00261) Completed in 0.01578 (63 reqs/sec) | Rendering: 0.00692 (43%) | DB: 0.00000 (0%) | 200 OK [http://localhost/welcome\]

As you can see... it renders the welcome controller and action, but on my browser it's still at the login screen. I can't figure out why it isn't redirecting me to the welcome/ page. Any ideas?

Oh.. and here is the code for the actual form:

    <% remote_form_for :session, :url => session_path do -%>       <fieldset style="border:0px;">         <p>           <label for="username" class="required">Username</label>           <%= text_field_tag :username, params[:username] %>         </p>         <p>           <label for="password" class="required">Password</label>           <%= password_field_tag :password, params[:password] %>         </p>         <p>         <%= submit_tag 'Log in' %>         </p>       </fieldset>     <% end -%>

You're using remote_form_for, which expects an Ajax response. I guess your welcome/index action renders simple html instead

Thorsten Mueller wrote:

You're using remote_form_for, which expects an Ajax response. I guess your welcome/index action renders simple html instead

Ok... so the remote_form_for always expects an Ajax response?.. If so, then how would I accomplish the redirect? I was using the remote_form_for to show the error messages.

hmm... is there no way to use the remote_form_for, then redirect?... I'm assuming that wouldn't be very clean? any ideas?

let me explain a little more how I'm using the remote_form_for.. then maybe I'll get better suggestions:

I have this code at the top of the form:

<div id="error"><% if flash[:error] %><%= flash[:error] %><% end %></div>

then the create.rjs has this:

page.visual_effect :highlight, :error page.replace_html :error, flash[:error] flash.discard

is there anyway to accomplish the same effect for the login using an rjs template... seeing as how I'll need to forward after logging in?

Thorsten Mueller wrote:

You're using remote_form_for, which expects an Ajax response. I guess your welcome/index action renders simple html instead

Ok... so the remote_form_for always expects an Ajax response?.. If so, then how would I accomplish the redirect? I was using the remote_form_for to show the error messages.

When an ajax request gets redirected, the javascript never sees the
redirect, just the final content. If you;re using ajax with a :update parameter (ie generating an
Ajax.Updater) then without extra client side code you're boned. If you're not (ie you're using rjs), then you can use page.redirect_to
inside your rjs file (which just generates a window.location=...)

Fred

Frederick Cheung wrote:

Thorsten Mueller wrote:

You're using remote_form_for, which expects an Ajax response. I guess your welcome/index action renders simple html instead

Ok... so the remote_form_for always expects an Ajax response?.. If so, then how would I accomplish the redirect? I was using the remote_form_for to show the error messages.

When an ajax request gets redirected, the javascript never sees the redirect, just the final content. If you;re using ajax with a :update parameter (ie generating an Ajax.Updater) then without extra client side code you're boned. If you're not (ie you're using rjs), then you can use page.redirect_to inside your rjs file (which just generates a window.location=...)

Fred

Thanks for the replies guys! I understand what you guys are saying. I guess I'm confused as to the best way to implement. Or even if I should implement on the login anyways. Cause if you look at my create action on the sesion controller there really wouldn't be a way for me to use another rjs.. cause the one i'm using create.rjs is being used as an error view.

Any suggestions?

Frederick Cheung wrote:

Thorsten Mueller wrote:

You're using remote_form_for, which expects an Ajax response. I guess your welcome/index action renders simple html instead

Ok... so the remote_form_for always expects an Ajax response?.. If
so, then how would I accomplish the redirect? I was using the remote_form_for to show the error messages.

When an ajax request gets redirected, the javascript never sees the redirect, just the final content. If you;re using ajax with a :update parameter (ie generating an Ajax.Updater) then without extra client side code you're boned. If you're not (ie you're using rjs), then you can use
page.redirect_to inside your rjs file (which just generates a window.location=...)

Fred

Thanks for the replies guys! I understand what you guys are saying. I guess I'm confused as to the best way to implement. Or even if I
should implement on the login anyways. Cause if you look at my create action on the sesion controller there really wouldn't be a way for me to use another rjs.. cause the one i'm using create.rjs is being used as an error view.

You can render a different template, use a render :update block etc...

Fred

Frederick Cheung wrote:

so,

Fred

Thanks for the replies guys! I understand what you guys are saying. I guess I'm confused as to the best way to implement. Or even if I
should implement on the login anyways. Cause if you look at my create action on the sesion controller there really wouldn't be a way for me to use another rjs.. cause the one i'm using create.rjs is being used as an error view.

You can render a different template, use a render :update block etc...

Fred

So would I do this in the session controller, create action? Is this what you are suggesting?

  def create     user = User.authenticate(params[:username], params[:password])

    respond_to do |format|       if user         session[:user_id] = user.id         flash[:notice] = "Welcome back #{user.name}!"         format.html {render :action => :redirect}

      else         flash[:error] = "The username and/or password is invalid!"         format.html { render :action => :new }         format.js       end     end   end