そのねこが学ぶとき

ブログ移行しました→ http://chroju.github.io

RoRでログイン機能を実装する

  • sessionに情報を保存することで「ログイン」状態を実現する
  • 逆に言えばsession破棄で「ログアウト」扱いになる
  • Railsにはsessionオブジェクトが用意されており、これを使えば簡単にsessionへアクセス可能

……というわけで。

1. sessionコントローラを作成する

$ rails g controller sessions new create destroy
  • コントローラ作成のときは複数形!
  • newはログイン画面表示時に、createはログイン処理時に、destroyはログアウト処理時に使用

コントローラを作成したらとりまログイン処理を書いていく

  def create↲
      user = User.find_by_name(params[:name])↲
      if user and user.authenticate(params[:password])↲
          session[:user_id] = user.id↲
          redirect_to tasks_url↲
      else↲
          redirect_to login_url, :alert => "無効なユーザー名/パスワードです。"endend
  • フォームで入力した値など、URLパラメータを受け取るときはparamsを使う
  • authenticateメソッドは、引数とuserのパスワードダイジェストを比較して論理値を返す
  • タスク管理アプリを作っているので、ログイン成功時のリダイレクト先はtasks_url
  • ちな、hoge_urlは絶対パス、hoge_pathは相対パスになるらしい
  • 302 Redirectでは完全修飾URLに飛ぶのが仕様なので、redirect_toではhoge_urlを使う
  • 失敗時はlogin_urlに返し、エラーメッセージを渡す

2. ログイン画面を作成する

/app/views/sessions/new.html.erbを編集

 <div class="form"><% if flash[:alert] %><p id="notice"><%= flash[:alert] %></p><% end %>↲
↲
    <%= form_tag do %><fieldset><legend>ログインして下さい</legend>↲
↲
            <div><%= label_tag :name, 'ユーザー名:' %><%= text_field_tag :name, params[:name] %></div>↲
↲
            <div><%= label_tag :password, 'パスワード:' %><%= password_field_tag :password, params[:password] %></div>↲
↲
            <div><%= submit_tag "ログイン" %></div></fieldset><% end %></div>
  • 冒頭部分はログイン失敗時のalertメッセージ表示部分
    • flashオブジェクトについて良くわかってないので要調査
  • hoge_tagあたりのヘルパーメソッドももうちょっと調べときたい

3. ルーティング

config/routes.rbを編集してlogin周りのルーティングを設定する。以下の5行を追加。

controller sessions do
    get 'login' => :new
    post 'login' => :create
    delete 'logout' => :destroy
end
  • sessionsコントローラに対し、
    • /loginにGETでアクセスした場合はsessions#newを呼ぶ
    • /loginにPOSTでアクセスした場合はsessions#createを呼ぶ
    • /logoutにDELETEでアクセスした場合はsessions#destroyを呼ぶ
  • すなわちREST

ざっくり簡単だが、とりあえずこれで認証画面とログイン処理は実装完了。

まだログアウトはできていないし、ログイン後の処理なんかも書いてないけど、とりあえずやりかたはわかったのでメモ。

参考

Ruby on Rails ログイン画面の作成 - ayaketanのプログラミング勉強日記