#認可
***認証(authentication)はサイトのユーザーを識別すること認可(authorization)***はそのユーザーが実行可能な操作を管理すること。
##beforeフィルター
ログインしていないユーザーが保護されているページにアクセスした時、ログインページに転送するために、beforeフィルターを使う。
class UsersController < ApplicationController
before_action :logged_in_user, only: [:edit, :update]
.
.
.
private
def user_params
params.require(:user).permit(:name, :email, :password,
:password_confirmation)
end
# beforeアクション
# ログイン済みユーザーかどうか確認
def logged_in_user
unless logged_in?
flash[:danger] = "Please log in."
redirect_to login_url
end
end
end
before_action
で何らかの処理が行われる直前に特定のメソッドを実行できる。またオプションとして、:only
オプションを渡すことで、コントローラ内の特定のアクションを行う前にだけフィルタを適用させる事ができる。
##フレンドリーフォワーディング
フレンドリーフォワーディングとはユーザーが認可前に開いていたページを認可後に開く仕組み。
→ユーザーを希望のページに転送するには、リクエスト時点のページをどこかに保存しておき、その場所にリダイレクトさせる必要がある。
module SessionsHelper
.
.
.
# 記憶したURL (もしくはデフォルト値) にリダイレクト
def redirect_back_or(default)
redirect_to(session[:forwarding_url] || default)
session.delete(:forwarding_url)
end
# アクセスしようとしたURLを覚えておく
def store_location
session[:forwarding_url] = request.original_url if request.get?
end
end
requestオブジェクトはアクセスしたユーザーの情報を取得。
request.メソッド
で使える
request.original_url
でリクエスト先のURLを取得
#サンプルユーザーの作成
##fakergemの使用
fakerをインストールしたあと、db/seeds.rbにコードを書く。
User.create!(name: "Example User",
email: "example@railstutorial.org",
password: "foobar",
password_confirmation: "foobar")
99.times do |n|
name = Faker::Name.name
email = "example-#{n+1}@railstutorial.org"
password = "password"
User.create!(name: name,
email: email,
password: password,
password_confirmation: password)
end
$ rails db:migrate:reset
$ rails db:seed
でデータベースに適用させる
##ページネーション
gemfileにwill_peginate gemとbootstrap-will_paginate gemを両方含ませる。
source 'https://rubygems.org'
gem 'rails', '5.1.6'
gem 'bcrypt', '3.1.12'
gem 'faker', '1.7.3'
gem 'will_paginate', '3.1.6'
gem 'bootstrap-will_paginate', '1.0.0'
paginateはキーがpageで値がページ番号のハッシュを引数に取る。
$ rails console \>> User.paginate(page: 1) User Load (1.5ms) SELECT "users".* FROM "users" LIMIT 30 OFFSET 0 (1.7ms) SELECT COUNT(*) FROM "users" => #<ActiveRecord::Relation [#<User id: 1,...
実際には
def index
@users = User.paginate(page: params[:page])
end
今回はページ番号を取る値にparams[:page]をとっているが、これはwill_paginateメソッドが自動で生成している。
おそらくアクセスされた番号のページということだと思う。
``