追記 2023/5/03
現在は以下コードでseed.rbの内容を適用できるようです!
flyctl ssh console
cd rails
bundle exec rails db:seed
exit
経緯
管理者権限機能を実装する際に管理者ユーザーをseed.rbに初期レコードとして入れる手法を使っていたのですが、Fly.ioの無料プランでリリースしようとすると、、、、、
まさかの本番環境のコンソールを開くことが出来ない事態。。。。。
という事で管理者権限ぽいのを環境変数を使って実装しよかなという次第です。
前提
gem device
とgem dotenv-rails
を導入済み
投稿用のコントローラーとしてposts_controller.rb
投稿用のモデルとしてPostモデル
を使用しています。
この記事での想定している状況
管理者ユーザーのみ投稿編集削除できる。
管理者以外のユーザーは各投稿の閲覧のみ。
実装
.envファイルの記述
コントローラーの記述
viewファイルの記述
①.envファイルの記述
~省略~
ADMIN_EMAIL=管理者ユーザーのemailアドレス
例)ADMIN_EMAIL=adminuser@gmail.com
ADMIN_EMAIL
という変数に管理者権限をもつemailを代入してます。
イコールの間にスペースを入れない方がエラーは起こりにくいです。
②コントローラーの記述
コントローラーの上部と下部に追記します。
※コントローラー下部はprivate
直下に書くようにしましょう!
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へのアクセスは制御出来ている状態ですが、管理者以外には非表示にしたい記述がある場合(ページ遷移リンク等)は 以下の条件文で挟むことで非表示することができます。
<% if user_signed_in? && current_user.email == ENV['ADMIN_EMAIL'] %>
#投稿ページへのリンクなど非表示にしたい内容
<% end %>
おまけ
Fly.ioでリリースして本番環境で動かない!
となった場合は以下記事を試してみてください。
参考記事