<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 8.3 退出 [8.1 節](#sessions)說過,我們要實現的認證系統會記住用戶的登錄狀態,直到用戶自行退出為止。本節,我們就要實現退出功能。退出鏈接已經定義好了([代碼清單 8.16](#listing-layout-login-logout-links)),所以我們只需編寫一個正確的控制器動作,銷毀用戶會話。 目前為止,會話控制器的動作都遵從了 REST 架構,`new` 動作用于登錄頁面,`create` 動作完成登錄操作。我們要繼續使用 REST 架構,添加一個 `destroy` 動作,刪除會話,實現退出功能。登錄功能在[代碼清單 8.13](#listing-log-in-success) 和[代碼清單 8.22](#listing-login-upon-signup) 中都用到了,但退出功能不同,只在一處使用,所以我們會直接把相關的代碼寫在 `destroy` 動作中。[8.4.6 節](#remember-tests)會看到,這么做(稍微重構后)易于測試認證系統。 退出要撤銷 `log_in`([代碼清單 8.12](#listing-log-in-function))完成的操作,即從會話中刪除用戶的 ID。為此,我們要使用 `delete` 方法,如下所示: ``` session.delete(:user_id) ``` 我們還要把當前用戶設為 `nil`。不過在現在這種情況下做不做這一步都沒關系,因為退出后會立即轉向根地址。[[13](#fn-13)]和 `log_in` 及相關的方法一樣,我們要把 `log_out` 方法放在會話輔助方法模塊中,如[代碼清單 8.26](#listing-log-out-method) 所示。 ##### 代碼清單 8.26:`log_out` 方法 app/helpers/sessions_helper.rb ``` module SessionsHelper # 登入指定的用戶 def log_in(user) session[:user_id] = user.id end . . . # 退出當前用戶 def log_out session.delete(:user_id) @current_user = nil end end ``` 然后,在會話控制器的 `destroy` 動作中調用 `log_out` 方法,如[代碼清單 8.27](#listing-destroy-session) 所示。 ##### 代碼清單 8.27:銷毀會話(退出用戶) app/controllers/sessions_controller.rb ``` 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 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 ``` 我們可以在[代碼清單 8.20](#listing-user-login-test-valid-information) 中的用戶登錄測試中添加一些步驟,測試退出功能。登錄后,使用 `delete` 方法向退出地址([表 8.1](#table-restful-sessions))發起 `DELETE` 請求,然后確認用戶已經退出,而且重定向到了根地址。我們還要確認出現了登錄鏈接,而且退出和資料頁面的鏈接消失了。測試中新加入的步驟如[代碼清單 8.28](#listing-user-logout-test) 所示。 ##### 代碼清單 8.28:測試用戶退出功能 GREEN test/integration/users_login_test.rb ``` require 'test_helper' class UsersLoginTest < ActionDispatch::IntegrationTest . . . test "login with valid information followed by logout" do get 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 end ``` (現在可以在測試中使用 `is_logged_in?` 了,所以向登錄地址發送有效信息之后,我們添加了 `assert is_logged_in?`。) 定義并測試了 `destroy` 動作之后,注冊、登錄和退出三大功能就都實現了。現在測試組件應該可以通過: ##### 代碼清單 8.29:**GREEN** ``` $ bundle exec rake test ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看