LoginSignup
2
0

More than 3 years have passed since last update.

Rails Tutorial(2週目)-10-

Last updated at Posted at 2019-06-09

認可

認証(authentication)はサイトのユーザーを識別すること認可(authorization)はそのユーザーが実行可能な操作を管理すること。

beforeフィルター

ログインしていないユーザーが保護されているページにアクセスした時、ログインページに転送するために、beforeフィルターを使う。

app/controllers/users_controller.rb
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オプションを渡すことで、コントローラ内の特定のアクションを行う前にだけフィルタを適用させる事ができる。

フレンドリーフォワーディング

フレンドリーフォワーディングとはユーザーが認可前に開いていたページを認可後に開く仕組み。

→ユーザーを希望のページに転送するには、リクエスト時点のページをどこかに保存しておき、その場所にリダイレクトさせる必要がある。

app/helpers/sessions_helper.rb
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にコードを書く。

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,...

実際には

app/controllers/users_controller.rb
def index
    @users = User.paginate(page: params[:page])
  end

今回はページ番号を取る値にparams[:page]をとっているが、これはwill_paginateメソッドが自動で生成している。
おそらくアクセスされた番号のページということだと思う。
``

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0