さて、前回の記事では、ユーザー登録の仕組みを作成しました。今度はログインの仕組みを作成します。
この記事は前回の続きなので、前回を読んでいないと、多分理解できません。
環境はruby-1.9.3-p0, rails3.2.2, sqlite3です。
コントローラーの作成
cd auth // プロジェクトフォルダへ移動 rails generate controller sessions new
sessions_controllerとsessions/view/new.html.erbのviewを作成します。
new.html.erbを変更
<h1>Log in</h1> <%= form_tag sessions_path do %> <p> <%= label_tag :email %><br/> <%= text_field_tag :email, params[:email] %> </p> <p> <%= label_tag :password %><br/> <%= password_field_tag :password %> </p> <p><%= submit_tag %></p> <% end %>
viewを作成。emailとパスワードの入力フィールドを表示します。
ルーティングの設定
get "log_in" => "sessions#new", :as => "log_in" # 今回追加 get "sign_up" => "users#new", :as => "sign_up" root :to => "users#new" resources :users resources :sessions # 今回追加
設定ができているかをrake routesコマンドで確認します。
log_in GET /log_in(.:format) sessions#new sign_up GET /sign_up(.:format) users#new root / users#new users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PUT /users/:id(.:format) users#update DELETE /users/:id(.:format) users#destroy sessions GET /sessions(.:format) sessions#index POST /sessions(.:format) sessions#create new_session GET /sessions/new(.:format) sessions#new edit_session GET /sessions/:id/edit(.:format) sessions#edit session GET /sessions/:id(.:format) sessions#show PUT /sessions/:id(.:format) sessions#update DELETE /sessions/:id(.:format) sessions#destroy
準備OKです。続いてsessions_controllerコントローラーにログイン処理を実装します。
ログイン処理
class SessionsController < ApplicationController def new end def create user = User.authenticate(params[:email], params[:password]) if user session[:user_id] = user.id redirect_to root_url, :notice => "Logged in!" else flash.now.alert = "Invalid email or passsword" render "new" end end end
上記の処理ではユーザーデータが取得できた場合はセッションにユーザーIDを保存し、画面遷移します。
ユーザー情報がない場合は、エラーメッセージを表示しています。
Userクラス
コントローラーで宣言したUserのauthenticate処理を実装します。
def self.authenticate(email, password) user = find_by_email(email) if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt) user else nil end end
メールと、ハッシュパスワードが等しい場合は、userオブジェクトを返しています。
さて、ここまでできたら、サーバーを起動して、http://localhost:3000/log_inにアクセスしましょう。
ミスがなければ画面が表示されるはずです。入力チェックと、正常入力を試してみてください。
loginが正常に働いて、画面遷移できれば成功です。
さて、次回はログアウトの仕組みを作成していきましょう。
0 件のコメント:
コメントを投稿