Labyrinth of Wisdom

-This is My Archive-


ログイン & ログアウト機能サンプル

WEBサービスで確実にお世話になるログイン&ログアウト機能のサンプルを作ってみたのでメモします。

Rails 4.25 ruby 2.23

データベース

  • usersテーブル

    こんな感じのテーブルを用意してください。値は何でもいいです。
    作り方は下記を参照。

id name email password
1 アラジン magi@hoge.com magimagi

ルーティング

  • /config/routes.rb
#ルートにアクセスするとtopコントローラーのindexアクションを呼び出す。
root "top#index"
#CRUD操作のnew/create/destroyのみ使用する。リソースが単数形なのに注意。
resource :sessions, only: [:new, :create, :destroy]

#個別にルーティングする方法もある。
#get "signin", to: "sessions#new"
#post "signin", to: "sessions#create"
#delete "signout", to: "sessions#destroy"

f:id:Labyrinth_of_Wisdom:20160225160208p:plain 個別ルーティングの場合はこうなる。 f:id:Labyrinth_of_Wisdom:20160225115708p:plain

モデル

  • /app/models/user.rb
#クラスメソッド
class << self
  def check(email, password)
    user = self.find_by(email: email)
    user_pass = self.find_by(password: password)
    #変数userとuser_passのidが一致すれば、変数userを返す
    if user == user_pass
      user
    else
      nil
    end
  end
end

コントローラー

  • /app/controllers/top_controller.rb

    中身は空で大丈夫です。

  • /app/controllers/sessions_controller.rb

#ログイン画面を呼び出す為のアクションなので中身は何もない
def new
end

#セッションを取得/ログイン
def create
  #user.rbに書いたクラスメソッドcheckを使う。フォームからの値をparamsメソッドで受け取る。
  @user = User.check(params[:session][:email], params[:session][:password])

  #@userがtrueなら、@userのnameをハッシュsessionにキー[:name]でセットする。
  if @user
    session[:name] = @user.name
    #メッセージをハッシュflashにキー[:success]でセットする。
    flash[:success] = "ログインに成功しました。"
    #rootのページに遷移する。
    redirect_to root_path
  else
    flash.now[:error] = "メールアドレスとパスワードが一致しません。"
    render "new"
  end
end

#セッションを破棄/ログアウト
def destroy
  #session[:name]に入れた値をdeleteメソッドで削除する。
  session.delete(:name)
  redirect_to new_sessions_path
  #個別ルーティングの場合
  #redirect_to signin_path
end

ビュー

  • /app/views/sessions/new.html.erb
<h1>Sign in</h1>

<!-- ログイン失敗のメッセージを出す -->
<%= flash[:error] %>

<%= form_for(:session, url: sessions_path) do |f|  %>
<!-- 個別ルーティングの場合 -->
<%#= form_for(:session, url: signin_path) do |f|  %>
  <%= f.label :email %>
  <%= f.text_field :email %>

  <%= f.label :password %>
  <%= f.password_field :password %>

  <%= f.submit "Sign in" %>
<% end %>
  • /app/views/top/index.html.erb
<!-- ログアウトリンク -->
<%= link_to "Log Out", :sessions, method: :delete %>
<!-- 個別ルーティングの場合 -->
<%# link_to "Log Out", signout_path, method: :delete %>

<!-- ログイン成功のメッセージを出す -->
<p><%= flash[:success] %></p>

<!-- ログインしたユーザーの名前を表示する -->
<p>Welcom<%= session[:name] %>さん</p>

とても簡易的ですが、ひとまずログインしたのがどのユーザーかを認識できるようになりました。