<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 8.6 練習 電子書中有練習的答案,如果想閱讀參考答案,請[購買電子書](http://railstutorial-china.org/#purchase)。 避免練習和正文沖突的方法參見[3.6 節](chapter3.html#mostly-static-pages-exercises)中的說明。 1. 在[代碼清單 8.32](#listing-user-model-remember) 中,我們定義了生成令牌和摘要的類方法,前面都加上了 `User`。這么定義沒問題,而且因為我們會使用 `User.new_token` 和 `User.digest` 調用,或許這樣定義意思更明確。不過,定義類方法有兩種更常用的方式,一種有點讓人困惑,一種極其讓人困惑。運行測試組件,確認[代碼清單 8.59](#listing-token-digest-self)(有點讓人困惑)和[代碼清單 8.60](#listing-token-digest-class-self)(極其讓人困惑)中的實現方式是正確的。(注意,在[代碼清單 8.59](#listing-token-digest-self) 和[代碼清單 8.60](#listing-token-digest-class-self) 中,`self` 是 `User` 類,而用戶模型中的其他 `self` 都是用戶對象實例。這就是讓人困惑的根源所在。) 2. [8.4.5 節](#remember-me-checkbox)說過,由于應用現在的設計方式,在[代碼清單 8.51](#listing-remember-me-test) 的集成測試中無法獲取 `remember_token` 虛擬屬性。不過,在測試中使用一個特殊的方法可以獲取,這個方法是 `assigns`。在測試中,可以訪問控制器中定義的實例變量,方法是把實例變量的符號形式傳給 `assigns` 方法。例如,如果 `create` 動作中定義了 `@user` 變量,在測試中可以使用 `assigns(:user)` 獲取這個變量。現在,會話控制器中的 `create` 動作定義了一個普通的變量(不是實例變量),名為 `user`,如果我們把它改成實例變量,就可以測試 `cookies` 中是否包含用戶的記憶令牌。填寫[代碼清單 8.61](#listing-login-create-user-instance) 和[代碼清單 8.62](#listing-improved-remember-me-test) 中缺少的內容(`?` 和 `FILL_IN`),完成改進后的“記住我”復選框測試。 ##### 代碼清單 8.59:使用 `self` 定義生成令牌和摘要的方法 GREEN app/models/user.rb ``` class User < ActiveRecord::Base . . . # 返回指定字符串的哈希摘要 def self.digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end # 返回一個隨機令牌 def self.new_token SecureRandom.urlsafe_base64 end . . . end ``` ##### 代碼清單 8.60:使用 `class &lt;&lt; self` 定義生成令牌和摘要的方法 GREEN app/models/user.rb ``` class User < ActiveRecord::Base . . . class << self # 返回指定字符串的哈希摘要 def digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end # 返回一個隨機令牌 def new_token SecureRandom.urlsafe_base64 end end . . . ``` ##### 代碼清單 8.61:在 `create` 動作中使用實例變量的模板 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 params[:session][:remember_me] == '1' ? remember(?user) : forget(?user) redirect_to ?user else flash.now[:danger] = 'Invalid email/password combination' render 'new' end end def destroy log_out if logged_in? redirect_to root_url end end ``` ##### 代碼清單 8.62:改進后的“記住我”復選框測試模板 GREEN test/integration/users_login_test.rb ``` require 'test_helper' class UsersLoginTest < ActionDispatch::IntegrationTest def setup @user = users(:michael) end . . . test "login with remembering" do log_in_as(@user, remember_me: '1') assert_equal assigns(:user).FILL_IN, FILL_IN end test "login without remembering" do log_in_as(@user, remember_me: '0') assert_nil cookies['remember_token'] end . . . end ```
                  <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>

                              哎呀哎呀视频在线观看