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という変数が使える。