简体   繁体   中英

Rails: redirect to previous page after login doesn't work

I am trying to redirect to the page from where I clicked login, but after logining in it doesn't redierect to previous page but stays on login page (although the user is already logged in). Here is my code:

session_helper.rb

module SessionsHelper

def sign_in(user)
    remember_token = User.new_remember_token
    cookies.permanent[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.encrypt(remember_token))
    self.current_user = user
end


def redirect_back_or(default)
    redirect_to(session[:return_to] || default)
    session.delete(:return_to)
end

def store_location
    session[:return_to] = request.fullpath
end
end

sessions_controller.rb

class SessionsController < ApplicationController
  include SessionsHelper
  def new
  end
  def create
    user = User.find_by_username(params[:session][:username])
    if user && user.authenticate(params[:session][:password])   
      cookies.permanent[:remember_token] = user.remember_token
      #redirect_to root_url,:notice => "Logged in!"
        redirect_back_or user
    else
      flash[:error] = 'Invalid email/password combination' # Not quite right!
      render 'new'
    end
  end
  def destroy
    cookies.delete(:remember_token)
    #session[:user_id] = nil
    redirect_to root_url, :notice => "Logged out!"
  end
end

I also tried to write in create function in sessions_controller.rb

redirect_to request.referer

but it doesn't work.

Am I missing something?

Thanks for your help!

The problem happens at store_location .

Though you havn't said in question, I guess you probably put this method in before_filter . So, no matter GET or POST or other request, the request hit this filter at first and store location.

Now, in this case, actually the user has two requests. One is to #new by GET, and the other is to #create by POST. In the later, his last request to #new was recorded as the going back location. So you'll see you always go back to #new :)

The solution is to filter the location to be stored.

def store_location
  disable_pattern = /\A\/user*/
  session[:return_to] = request.fullpath unless request.fullpath ~= disable_pattern
end

This pattern could solve current problem but not exclusive. In practice you may see even JS/JSON requests has been recorded, so you may need to add more restrictions according to the specific case. For example, only apply before_filter on #show or #index, use white list, etc.

I think request.referer may not have worked because of a typo in the method. It should be request.referrer .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM