【Rails6】cancancanで権限が無いページのURLアクセスでトップページにリダイレクトさせる方法

Rails6でgemのcancancanを導入済みの前提です。

権限が無いページのアクセスや権限が無いページへのURLを直接入力したときに、Railsのエラー画面では無く「権限がありません」とエラーメッセージを表示させてトップページにリダイレクトさせる方法です。

トップページにリダイレクトさせる

app/controllers/application_controller.rb  に以下を追加するだけです。

rescue_from CanCan::AccessDenied do |exception|
  redirect_to root_path, :alert => exception.message
end

これで完了です。

下記に実際のエラー画面の画像を載せておきます。

cancancanのリダイレクト

エラーメッセージの日本語化

エラーメッセージの日本語化するには、rails-i18nというgemを使用します。Gemfileに以下の一文を追加して、bundle installをします。

gem 'rails-i18n'

次に、config/application.rbに以下を追記します。これにより、サーバ再起動後にエラーメッセージが日本語化されていると思います。

require_relative "boot"

require "rails/all"

Bundler.require(*Rails.groups)

module 〇〇
  class Application < Rails::Application
    config.load_defaults 6.1
    config.time_zone = 'Tokyo'
    config.i18n.default_locale = :ja
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.yml').to_s]
  end
end

modelの属性名については英語のままになっているので、以下のファイルを作成し、追加。

config/locales/ja.yml

ja:
  unauthorized:
    manage:
      all: アクセス権限がありません
  activerecord:
    models:
      user: ユーザー
    attributes:
      user:
        name: 名前
        email: メールアドレス
        password: パスワード

これで、日本語化の完了です。

cancancanのエラーメッセージ日本語化

他にもこんな記事があります!