2012年4月11日水曜日

Ruby on Rails3でdeviseを使う前準備その2ログイン

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

コメントを投稿

Related Posts Plugin for WordPress, Blogger...