さて、前回の記事では、ユーザー登録の仕組みを作成しました。今度はログインの仕組みを作成します。
この記事は前回の続きなので、前回を読んでいないと、多分理解できません。
環境は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 件のコメント:
コメントを投稿