Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RailsTutorial.org Chapter9 session.delete issues

I'm following the tutorial on http://ruby.railstutorial.org

Specifically, chapter 9 (9.2.3) http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-users#top

I've managed to get the part when a user will get prompted to login when accessing a restricted page then be redirected back to the restricted page after successfully logging in.

I'm trying to get it so that after one redirects to the protected page, the next login attempt will direct back to the main user profile page, however, session.delete(:return_to) doesn't appear to be working and the user is repeatedly directed back to the originally saved protected page. Here's my code:

My session Controller:

class SessionsController < ApplicationController

  def new

  end

  def create
    user = User.find_by_email(params[:session][:email])
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_back_or user
      # Sign the user in and redirect to the user's show page.
    else
      # Create an error message and re-render the signin form.
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end

  ...

end

My session helper:

module SessionsHelper

  def sign_in(user)
    cookies.permanent[:remember_token] = user.remember_token
    self.current_user = user
  end

  def signed_in?
    !current_user.nil?
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
  end

  def current_user?(user)
    user == current_user
  end

  def sign_out
    self.current_user = nil
    cookies.delete(:remember_token)
  end

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

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

Any help you can give would be brilliant! It seems like session.delete() simply isn't working.

like image 983
user1686616 Avatar asked Jun 12 '26 13:06

user1686616


2 Answers

The following block solved it. Nothing else needs to change.

def signed_in_user
  unless signed_in?
    store_location
    redirect_to signin_url, notice: "Please sign in." #unless signed_in?
  end
end
like image 113
Jesse Wang Avatar answered Jun 14 '26 04:06

Jesse Wang


When I did the tutorial, my code had the first lines of the SessionsController#create method as just:

user = User.find_by_email(params[:email])
if user && user.authenticate(params[:password])

But, I can see that the corresponding code in the book has changed to:

user = User.find_by_email(params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])

I attempted to use that new code in my sample_app, but most of my tests ended up failing. So, for you, I guess test adding the downcase method to your params[:session][:email] call first, and if that doesn't work, try substituting the lines out for the session-less code above and see if it works.

Update

After looking at your code, as far as I can tell, these are your problems:

You're calling session.delete(:return_to) in SessionsController#create for some reason. This line can be removed:

app/controllers/sessions_controller.rb

def create
  user = User.find_by_email(params[:session][:email].downcase)
  if user && user.authenticate(params[:session][:password])
    # session.delete(:return_to)
    sign_in user
    # ...
  #...
end

Both lines of code in your UsersController#signed_in_user method need to be put in the unless block, not just the call to redirect_to:

app/controllers/users_controller.rb

def signed_in_user
  unless signed_in?
    store_location
    redirect_to signin_url, notice: "Please sign in." #unless signed_in?
  end
end

If you make these changes and run your tests, you'll still have a Nokogiri::XML::XPath::SyntaxError: on your call to

spec/requests/authentication_pages_spec.rb

it { should have_exact_title('title', text: full_title('')) }` 

but I'm assuming this is a custom matcher you're planning to work on. If not and it's a mistake, remove it and all your tests will pass.

like image 27
Paul Fioravanti Avatar answered Jun 14 '26 03:06

Paul Fioravanti