Logout Error with Hartl's Ruby on Rails Tutorial 8.3 -
i'm having problem assert_select in users_login_test in 8.3 of michael hartl's ruby on rails tutorial.
this test:
test "login valid information followed logout" login_path post login_path, session: { email: @user.email, password: 'password' } assert is_logged_in? assert_redirected_to @user follow_redirect! assert_template 'users/show' assert_select "a[href=?]", login_path, count: 0 assert_select "a[href=?]", logout_path assert_select "a[href=?]", user_path(@user) delete logout_path assert_not is_logged_in? assert_redirected_to root_url follow_redirect! assert_select "a[href=?]", login_path assert_select "a[href=?]", logout_path, count: 0 assert_select "a[href=?]", user_path(@user), count: 0 end
when run test 1 failure:
fail["test_login_with_valid_information_followed_by_logout", userslogintest, 2016-01-20 09:51:41 +0000] test_login_with_valid_information_followed_by_logout#userslogintest (1453283501.83s) expected @ least 1 element matching "a[href="/login"]", found 0.. expected 0 >= 1. test/integration/users_login_test.rb:31:in `block in <class:userslogintest>'
here sessions controller:
class sessionscontroller < applicationcontroller def new end def create user = user.find_by(email: params[:session][:email].downcase) if user && user.authenticate(params[:session][:password]) log_in user remember user redirect_to user else flash.now[:danger] = 'invalid email/password combination' render 'new' end end def destroy log_out redirect_to root_url end end
my sessions_controller has destroy method redirects root_url. not sure problem know test fails , when try logout redirected main page still logged in (in corner still have links profile, settings , logout).
@papouche guinslyzinho asked me post views, helper , destroy controller:
view: header.html.rb
<header class="navbar navbar-fixed-top navbar-inverse"> <div class="containter"> <%= link_to "sample app", root_path, id: "logo" %> <nav> <ul class="nav navbar-nav navbar-right"> <li><%= link_to "home", root_path %></li> <li><%= link_to "help", help_path %></li> <%if logged_in? %> <li><%= ;link_to "users", "#"%></li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown"> account <b class="caret"></b> </a> <ul class="dropdown-menu"> <li><%= link_to "profile", current_user %></li> <li><%= link_to "settings", "#" %></li> <li class="divider"></li> <li> <%= link_to "log out", logout_path, method: "delete" %> </li> </ul> </li> <%else %> <li><%= link_to "log in", login_path %></li> <%end %> </ul> </nav> </div> </header>
sessions_helper:
module sessionshelper #logs in given user def log_in(user) session[:user_id] = user.id end #remembers user in session def remember(user) user.remember cookies.permanent.signed[:user_id] = user.id cookies.permanent[:remember_token] = user.remember_token end #returns user corresponding remember token cookie def current_user if (user_id = session[:user_id]) @current_user ||= user.find_by(id: user_id) elsif(user_id = cookies.signed[:user_id]) user = user.find_by(id: user_id) if user && user.authenticated?(cookies[:remember_token]) log_in user @current_user = user end end end #returns true if user logged in, false otherwise def logged_in? !current_user.nil? end def log_out session.delete(:user_id) @current_user = nil end #forgets persistent session def forget(user) user.forget cookies.delete(:user_id) cookies.delete(:remember_token) end #logs out current user def forget(current_user) session.delete(:user_id) @current_user = nil end end
sessions_controller: destroy
def destroy log_out redirect_to root_url end
you referencing section 8.3 of hartl tutorial, looks you've started work on next section, remember me. implement persistent sessions.
i can tell, because have 'remember' stuff in code. example:
def remember(user) user.remember cookies.permanent.signed[:user_id] = user.id cookies.permanent[:remember_token] = user.remember_token end
your test failing, because have active remember token cookie, log_out
method doesn't 'forget' it. essentially, you've half-completed hartl's section; tests naturally failing (proof tests work!)
if continue along tutorial, guide through process of forgetting cookie when logging out. or, can backtrack , remove bits put after 8.3. either way, test should pass.
Comments
Post a Comment