1
0

More than 1 year has passed since last update.

【rails】seedやコンソールを使わず環境変数で管理者権限を実装する。(脳筋)

Last updated at Posted at 2023-02-10

追記 2023/5/03

現在は以下コードでseed.rbの内容を適用できるようです!

PowerShell
flyctl ssh console
cd rails 
bundle exec rails db:seed
exit

経緯

管理者権限機能を実装する際に管理者ユーザーをseed.rbに初期レコードとして入れる手法を使っていたのですが、Fly.ioの無料プランでリリースしようとすると、、、、、
まさかの本番環境のコンソールを開くことが出来ない事態。。。。。

という事で管理者権限ぽいのを環境変数を使って実装しよかなという次第です。

前提

gem devicegem dotenv-railsを導入済み

投稿用のコントローラーとしてposts_controller.rb
投稿用のモデルとしてPostモデルを使用しています。

この記事での想定している状況

管理者ユーザーのみ投稿編集削除できる。
管理者以外のユーザーは各投稿の閲覧のみ。

実装

.envファイルの記述
コントローラーの記述
viewファイルの記述

①.envファイルの記述

.env
~省略~
ADMIN_EMAIL=管理者ユーザーのemailアドレス
例)ADMIN_EMAIL=adminuser@gmail.com

ADMIN_EMAILという変数に管理者権限をもつemailを代入してます。

イコールの間にスペースを入れない方がエラーは起こりにくいです。

②コントローラーの記述

コントローラーの上部と下部に追記します。

※コントローラー下部はprivate直下に書くようにしましょう!

posts_controller.rb
class PostsController < ApplicationController
  before_action :authenticate_user! , except: [:show, :index]
  #追記1ここから
+ before_action :if_not_admin, except: [:show, :index]
  #追記1ここまで
  def index
    @posts = Post.all
  end
  def show
    @post = Post.find(params[:id])
  end
  def new
    @post = Post.new
  end
#~~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~~~
private
  #追記2ここから
+ def if_not_admin
+    redirect_to root_path unless current_user.email == ENV['ADMIN_EMAIL']
+ end
  #追記2ここまで
end

追記1(コントローラー上部)と追記2(コントローラー下部)の記述です。

.envファイルで宣言した変数はENV['環境変数']で取得できます。

追記2で宣言したdef if_not_admin「ログインしているメアドが管理者のメアドと一致しない時,rootで設定したpathに戻ってくる」 というメソッドです。

追記1は追記2で定義したdef if_not_adminメソッドがコントローラの各アクションが動く前に実行されるという記述です。

後部のexcept: [:show, :index]def if_not_adminメソッドを適用しないアクションを指定しています。
今回の場合、管理者でないユーザーも投稿の確認が出来る状況を想定しているため投稿閲覧に関連するindex,showアクションを指定しています。

詳しくはこちらを

③viewファイルの記述

上記コントローラーの記述でviewへのアクセスは制御出来ている状態ですが、管理者以外には非表示にしたい記述がある場合(ページ遷移リンク等)は 以下の条件文で挟むことで非表示することができます。

viewファイル
<% if user_signed_in? && current_user.email == ENV['ADMIN_EMAIL'] %>  
    #投稿ページへのリンクなど非表示にしたい内容
<% end %>

おまけ

Fly.ioでリリースして本番環境で動かない!
となった場合は以下記事を試してみてください。

参考記事

1
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
1
0