Ruby on Rails ショッピングカート part9_1 アクセス制限

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

  1. メソッド実装
     すべての呼び出しにフィルタをかけるので、
     /app/controllers/application.rbに記述する。
    
     それを子クラスで適宜呼び出しを行う。
     フィルタを行うか、行わないか、を制御する。
    
    1. /app/controllers/application.rb
       class ApplicationController < ActionController::Base
         model :cart
         model :line_item
      
         private
         def redirect_to_index(msg = nil)
           flash[:notice] = msg if msg
           redirect_to(:action => 'index')
         end
      
         def authorize
           unless session[:user_id]
             flash[:notice] = "ログインしてください"
             redirect_to(:controller => "login", :action => "login")
           end
         end
       end
      
  2. 呼び出し
     上記のメソッドを、コントローラー内で呼び出しを行う。
     管理画面なので、adminコントローラー、loginコントローラーで呼び出しを行う。
    
     しかし、loginアクションだけはログインしていないユーザでも呼び出せるように
     しなくてはいけないので、loginアクションだけは除外する。
    
    1. /app/controllers/admin_controller.rb (編集)
       class AdminController < ApplicationController
         before_filter :authorize
      
    2. /app/controllers/login_controller.rb (編集)
       class LoginController < ApplicationController
         before_filter :authorize, :except => :login
      
  3. 実行
     今まで作成したアクションは思うように動いてくれた。
     loginアクションだけエラーが表示されなかった。
    
     ログインした後は、各画面を表示できた。
     また、再度ログイン画面で認証されないユーザでログインしたら、
     その後は、各画面が表示できない。(当たり前だけどね)
    
  4. ユーザ削除のメソッド実装、フォーム作成
     削除するフォームを作成して、メソッドを実装していく!!
    
     すべてのユーザを削除してしまうと管理操作ができなくなるので防止対策
     が必要。ここでもUserモデル内にフックメソッドを定義して、モデルが
     destroyされる前にフックメソッドを呼ぶ。
    
    1. /app/model/user.rb
       before_destroy :dont_destroy_dave
       def dont_destroy_dave
         raise "daveを削除することはできません" if self.name == 'dave'
       end
      
    2. /app/controllers/login_controller.rb
       def delete_user
         id = params[:id]
         if id && user = User.find(id)
           begin
             user.destroy
             flash[:notice] = "ユーザ #{user.name} が削除されました"
           rescue
             flash[:notice] = "このユーザを削除することはできません"
           end
         end
         redirect_to(:action => :list_users)
       end
      
       def list_users
         @all_users = User.find(:all)
       end
      
    3. /app/views/login/list_users.rhtml
       <% @page_title = "ユーザ一覧" -%>
       <table>
       <% for user in @all_users -%>
       <tr>
         <td><%= user.name %></td>
         <td><%= link_to("(削除)", :action => :delete_user, :id => user.id) %></td>
       </tr>
       <% end -%>
       </table>
      
  5. 作成したフォーム表示
     http://www.bishounen.sakura.ne.jp/rails_depot/login/list_users
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/151_09_list_users.jpg
  6. ユーザ削除
     prakユーザを削除してみた。成功!!
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/151_10_delete_prak_user.jpg
  7. ユーザ削除(フィルタ)
     フィルタの対象のdaveユーザを削除しようと思った。・・・・・削除できない!!
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/151_11_delete_dave_user.jpg
  8. レイアウト修正
     今までの機能をレイアウトのサイドバーに追加したいな。
     ここでもログインしていれば、サイドバーが表示できるようになっている。
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/151_12_layout_update.jpg
     ログインしていない時に、ログインページ以外を指定すると、
     こんな感じ。この時もサイドバーは表示されないね。
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/151_13_layout_update_otherlogin.jpg
     逆にログインページを指定すると、こんな感じ。
     この時もサイドバーは表示されないね。
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/151_14_layout_update_login.jpg
  9. logout実装
     これはメソッドを追加するだけ。
    
    1. /app/controllers/login_controller.rb
       def logout
         session[:user_id] = nil
         flash[:notice] = "ログアウトしました"
         redirect_to(:action => "login")
       end
      
  10. ログアウト実行
     ログアウトできるかな?・・・・・できた!!
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/151_15_logout.jpg

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