学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Ruby on RailsでWebアプリケーション開発その32 ログイン機能の実装

<<前  [TOP]  次>>


ログインとログアウトのためのセッションコントローラと管理者用のコントローラを追加します。


まずはセッションコントローラの作成です。
コマンドプロンプトで「rails generate controller Sessions new create destroy」と入力します。
f:id:MrRadiology:20180306113229p:plain


次に管理者用のコントローラ作成です。
コマンドプロンプトで「rails generate controller Admin index」と入力します。
f:id:MrRadiology:20180306113437p:plain


Sessionsコントローラcreate()メソッドを編集します。
「:user_id」をキーとしてUserオブジェクトのidをセッションに記録します。
destroy()メソッドにはログアウトした時の処理を実装します。


【app/controllers/sessions_controller.rb】

class SessionsController < ApplicationController
  def new
  end

  def create
	user = User.find_by_name(params[:name])
	if user and user.authenticate(params[:password])
		session[:user_id] = user.id
		redirect_to admin_url
	else
		redirect_to login_url, alert: '無効なユーザ/パスワードの組み合わせです。'
	end
  end

  def destroy
	session[:user_id] = nil
	redirect_to login_url, alert: "ログアウトしました。"
  end
end



sessionsビューの「new.html.erb」を実装します。


【app/views/sessions/new.html.erb】

<% if flash[:alert] %>
<div id="notice"><%= flash[:alert] %></div>
<% end %>
<br>
<h1>Login ログイン</h1>
<br>
<%= form_tag do %>
<div class="order_form">
	<fieldset>
		<legend>ログインして下さい。</legend>
		<br>
		<div>
			<%= label_tag :name, 'ユーザ名' %>
			<%= text_field_tag :name, params[:name] %>
		</div>
		<div>
			<%= label_tag :password, 'パスワード' %>
			<%= password_field_tag :password, params[:password] %>
		</div>
		<div>
		<br>
			<%= submit_tag "ログイン" %>
		</div>
	</fieldset>
</div>
<% end %>

このフォームはモデルオブジェクトに直接関連付けられていません。
「form_for」を使わずに、通常のHTMLの「form」タグを作成する「form_tag」を使っています。
「input」タグを作成するために「text_field_tag」と「password_field_tag」を使用します。
このタイプのフォームを使えば、paramsの値をフォームのフィールドに直接関連付けすることが出来ます。
フォームフィールドの値がparamsを使ってコントローラとビューの間をやり取りします。
ユーザがログインしたらユーザの「id」をセッションに格納します。


管理画面のindexビューを実装します。


【app/views/admin/index.html.erb】

<h1>Login ログインしました。</h1>
<br>
<p>現在時刻:<%= Time.new %></p>



「config」フォルダにある「routes.rb」ファイルを編集します。
今まではモデルとルートの作成をscaffoldジェネレータに任せていましたが、今回のコントローラにはデータベースに基づいたモデルがないのでコントローラだけを作成しています。
そのため、「routes.rb」ファイルにアクション情報を指定する必要があります。


【config/routes.rb】

Rails.application.routes.draw do

  get 'admin' => 'admin#index'

  controller :sessions do

    get 'login' => :new
    post 'login' => :create
    delete 'logout' => :destroy

  end


  resources :users
  resources :orders
  resources :line_items
  resources :carts
  get 'market/index'

  resources :goods

  root :to => 'market#index', as: 'market'
end



追加、変更したのは以下の部分です。

get 'admin' => 'admin#index'

controller :sessions do
  get 'login' => :new
  post 'login' => :create
  delete 'logout' => :destroy
end



http://localhost:3000/login」にアクセスします。
f:id:MrRadiology:20180306162136p:plain
f:id:MrRadiology:20180306162202p:plain
f:id:MrRadiology:20180306162239p:plain


<<前  [TOP]  次>>