目標
事前に設定した管理者用パスワードを打ち込んだ場合のみ、管理者用メニューを見れるようにする。
環境
- Ruby 3.0.4
- Rails 6.1.7
方針
管理者用ログインボタンから管理者用パスワード入力画面(admin_session
)に遷移させ、入力した内容をadmin_authentication
に送り、事前に.env
上に用意しておいたパスワードと一致したときのみ、メニュー画面(admin_index
)を表示(レンダー)させる。一致しない場合は管理者用パスワード入力画面(admin_session
)を表示(リダイレクト)させる。
完成形
コントローラー(トップページを扱うもの:今回はhello_controller.rb)
#前略
def admin_session
end
def admin_authentication
if params[:input_password] == ENV['ADMIN_PASSWORD']
render "admin_index"
else
flash[:fail]="パスワードが違います"
redirect_to hello_admin_session_path
end
end
def admin_index
end
#後略
ルーティング
#前略
get 'hello/admin_authentication'=> 'hello#admin_session'
post 'hello/admin_authentication'=> 'hello#admin_authentication'
get 'hello/admin_session' => 'hello#admin_session'
get 'hello/admin_index' => 'hello#admin_index'
#後略
ビューファイル
<p>パスワードを入力してください</p>
<%= form_tag hello_admin_authentication_path, method: :post do %>
<%= password_field_tag 'input_password' %>
<%= button_tag do %>
<span>確認</span>
<% end %>
<% end %>
<%= flash[:fail] %>
<h1>ここは管理者用メニューです</h1>
envファイル
ADMIN_PASSWORD = 1111
手順
1.gem "dotenv-rails"の導入
dotenv-railsとは、環境変数を管理する事が出来るgemです。
まずは、dotenv-railsをインストールする為に、Gemfileに下記を追加してbundle installします。
gem 'dotenv-rails'
bundle install
次に、アプリケーションのルート直下に.envファイルを作成します。
最後に、作成した.envファイルにパスワードを記述します。
今回は”1111”としておきますが、自由に変更してください。
ADMIN_PASSWORD = 1111
2.ビューファイルの記述
今回は入力した内容をDBに保存したいわけではないので、form_tagで、methodにpostを指定します。
また、パスワードが一致しなかったときのためにflashメッセージを用意しておきます。
<p>パスワードを入力してください</p>
<%= form_tag hello_admin_authentication_path, method: :post do %>
<%= password_field_tag 'input_password' %>
<%= button_tag do %>
<span>確認</span>
<% end %>
<% end %>
<%= flash[:fail] %>
<h1>ここは管理者用メニューです</h1>
3.ルーティングとコントローラーの設定
ルーティング
hello/admin_authentication
に関しては、post
(つまりform_tag
に入力)があったときにはパスワードの認証をするためにhello#admin_authentication
アクションへ、またリロード等でget
があったときにはhello#admin_session
アクションへ送り、admin_session.html.erb
を表示させます。
#前略
get 'hello/admin_authentication'=> 'hello#admin_session'
post 'hello/admin_authentication'=> 'hello#admin_authentication'
get 'hello/admin_session' => 'hello#admin_session'
#後略
コントローラー(トップページを扱うもの:今回はhello_controller.rb)
admin_session.html.erb
での入力をparams[:input_password]
で受け取り、ENV['ADMIN_PASSWORD']
で.envファイルから持ってきたパスワードと比較し、if文で処理します。
一致した場合はadmin_index.html.erb
へ、一致しなかった場合はadmin_session.html.erb
へリダイレクトし、flash
を使ってメッセージを呼び出します。
#前略
def admin_session
end
def admin_authentication
if params[:input_password] == ENV['ADMIN_PASSWORD']
redirect_to hello_admin_index_path
else
flash[:fail]="パスワードが違います"
redirect_to hello_admin_session_path
end
end
def admin_index
end
#後略