Ruby on Rails ショッピングカート part9 ログイン

Ruby on Rails において ショッピングカート とは以下を示します。

  1. メソッド実装、ビュー実装
     login()メソッドを実装する。
     ここでは、セッションにUserオブジェクトのidを格納する。
     login_rhtmlビューも実装する。
    
    1. /app/controllers/login_controller.rb
       def login
         if request.get?
           session[:user_id] = nil
           @user = User.new
         else
           @user = User.new(params[:user])
           logged_in_user = @user.try_to_login
      
           if logged_in_user
             session[:user_id] = logged_in_user.id
             redirect_to(:action => "index")
           else
             flash[:notice] = "ユーザ/パスワードの組み合わせが無効です"
           end
         end
       end
      
    2. /app/views/login/login.rhtml
       <%= form_tag %>
       <table>
         <tr>
           <td>ユーザ名:</td>
           <td><%= text_field("user", "name") %></td>
         </tr>
         <tr>
           <td>パスワード:</td>
           <td><%= password_field("user", "password") %></td>
         </tr>
      
         <tr>
           <td></td>
           <td><input type="submit" value=" ログイン " /></td>
         </tr>
       </table>
       <% end_form_tag %>
      
  2. クラスメソッド実装
     上記メソッドから呼び出され、ユーザ認証を行うメソッドを追加する。
    
    1. /app/models/user.rb
       def self.login(name, password)
         hashed_password = hash_password(password || "")
         find(:first,
              :conditions => ["name = ? and hashed_password = ?",
                               name, hashed_password])
       end
      
       def try_to_login
         User.login(self.name, self.password)
       end
      
  3. index.rhtmlビュー、index()メソッド編集
     上記までで良いが、index.rhtmlビュー、index()メソッドを修正したいと思う。
    
    1. /app/views/login/index.rhtml
       <%  @page_title = "ストア管理" -%>
      
       <h1>ストアの状況</h1>
      
       <p>
         システム内の注文の総数: <%= @total_orders %>
       </p>
      
       <p>
         発送待ちの注文の件数: <%= @pending_orders %>
       </p>
      
    2. /app/controllers/login_controller.rb
       def index
         @total_orders   = Order.count
         @pending_orders = Order.count_pending
       end
      
  4. クラスメソッド編集
     上記のindex()メソッドで発送待ちの注文件数を返すために、
     クラスメソッドを追加する。
    
    1. /app/models/order.rb
       def self.count_pending
         count("shipped_at is null")
       end
      
  5. 実行
     とりあえず表示して認証してみる。
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/151_06_login.jpg
     ログイン失敗
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/151_07_login_failure.jpg
     ログイン成功
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/151_08_login_success.jpg
     ログ出力も比較してみるけど、一見は「成功、失敗」はわからないが、
     リダイレクト先を見ればわかるよね。
    
    1. /log/production.log
       Processing LoginController#login
       (for 124.102.37.145 at 2007-02-08 22:59:03) [POST]
         Session ID: 5f46660e9b92cc4993ae47de936ece2d
         Parameters: {"user"=>{"name"=>"admin", "password"=>"admin"},
         "action"=>"login", "controller"=>"login"}
       Rendering  within layouts/admin
       Rendering login/login
       Completed in 0.08620 (11 reqs/sec) |
       Rendering: 0.00379 (4%) | DB: 0.00933 (10%) |
       200 OK [http://www.bishounen.sakura.ne.jp/rails_depot/login/login]
      
       Processing LoginController#login
       (for 124.102.37.145 at 2007-02-08 23:01:17) [POST]
         Session ID: 5f46660e9b92cc4993ae47de936ece2d
         Parameters: {"user"=>{"name"=>"stark", "password"=>"stark"},
         "action"=>"login", "controller"=>"login"}
       Redirected to http://www.bishounen.sakura.ne.jp/rails_depot/login
       Completed in 0.29419 (3 reqs/sec) | DB: 0.20764 (70%) |
       302 Found [http://www.bishounen.sakura.ne.jp/rails_depot/login/login]
      

ご訪問頂き有難う御座います。 当サイトを効率良く使うためにまずは FrontPage を見て下さい。 検索方法、一覧表示などの各情報を纏めています。
当サイトの説明 → Frontpage