うめぼしジョイスティック - ivoice

CakePHP、JavaScript、jQuery等のプログラミングについて書いていきます 思考は、うめぼしのように硬く、そして柔らかく。

Railsのあれこれ その4

ログイン・ログアウト処理はややこしい

ルーティングは

  get "login" => "users#login_form"
  post "login" => "users#login"
  post "logout" => "users#logout"

このように、ログアウトはpostになる。

new.html.erbのビューに

<% @user.errors.full_messages.each do |message| %>
    <%= message %> #エラーの表示
<% end %>

<%= form_tag("/users/create") do %>
  <p>ユーザー名</p>
  <input name="name" value="<%= @user.name %>">
  <p>メールアドレス</p>
  <input name="email" value="<%= @user.email %>">
  <p>パスワード</p>
  <input name="password" type="password" value="<%= @user.password %>">
  <input type="submit" value="登録">
<% end %>

このように書く。これはサインアップ(登録)画面。

ログイン画面は

login_form.html.erb というログイン用のビューに

<% if @error_message %>
    <%= @error_message %> #エラーメッセージを表示
<% end %>
<%= form_tag("/login") do %>
  <p>メールアドレス</p>
  <input name="email" value="<%= @email %>">
  <p>パスワード</p>
  <input type="password" name="password" value="<%= @password %>">
  <input type="submit" value="Log In">
<% end %>

このように書く。フォームはログインに飛ばしている。

コントローラーは

def new
  @user = User.new
end

def create
  @user = User.new(
    name: params[:name],
    email: params[:email],
    image_name: "user_image.jpg",
    password: params[:password]
  )
  if @user.save
    session[:user_id] = @user.id
    flash[:notice] = "ユーザー登録が完了しました"
    redirect_to("/users/#{@user.id}")
  else
    render("users/new")
  end
end


def login_form
end


def login
  @user = User.find_by(email: params[:email], password: params[:password])
  if @user
    session[:user_id] = @user.id
    flash[:notice] = "ログインしたよ"
    redirect_to("/posts/index")
  else
    @error_message = "メールアドレスかパスワードが間違っています"
    @email = params[:email]
    @password = params[:password]
    render("users/login_form")
  end
end

def logout
  session[:user_id] = nil
  flash[:notice] = "ログアウトしたよ"
  redirect_to("/login")
end

このようになる。

「session」という変数の session[:user_id]に @user.id を入れて、ログイン認証をするところがポイントである。

また、全体に変数を適用する場合は before_actionを用いる。

class ApplicationController < ActionController::Base
  before_action :set_current_user  
  def set_current_user
    @current_user = User.find_by(id: session[:user_id])
  end
end

このように、ApplicationControllerでbefore_actionを定義し、 @current_userという変数にユーザー情報を入れる。

全コントローラーのアクションが実行される前にログインユーザーの情報を変数を入れているので、すべてのビューで@current_userという変数が使える。