シンプルな管理者機能【RubyOnRails】

## 目標
__事前に設定した管理者用パスワードを打ち込んだ場合のみ、管理者用メニューを見れるようにする。__

## 環境
- Ruby 3.0.4
- Rails 6.1.7

## 方針
管理者用ログインボタンから管理者用パスワード入力画面（`admin_session`）に遷移させ、入力した内容を`admin_authentication`に送り、事前に`.env`上に用意しておいたパスワードと一致したときのみ、メニュー画面（`admin_index`）を表示（レンダー）させる。一致しない場合は管理者用パスワード入力画面（`admin_session`）を表示（リダイレクト）させる。

## 完成形
##### コントローラー(トップページを扱うもの：今回はhello_controller.rb)
```ruby: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

#後略
```
##### ルーティング
```ruby:routes.rb
#前略
  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'
#後略
```
##### ビューファイル
```erb:admin_session.html.erb
<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] %>
```


```erb:admin_index.html.erb
<h1>ここは管理者用メニューです</h1>
```

##### envファイル
```.env
ADMIN_PASSWORD = 1111 
```

## 手順
### 1.gem "dotenv-rails"の導入
dotenv-railsとは、環境変数を管理する事が出来るgemです。
まずは、dotenv-railsをインストールする為に、Gemfileに下記を追加してbundle installします。

```Gemfile:Gemfile
gem 'dotenv-rails'
```
```console:コマンドプロンプト/ターミナル
bundle install
```

次に、アプリケーションのルート直下に.envファイルを作成します。
![S__74891288.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2024218/b83b7e6f-ac7a-7bfe-c5c4-12f2c800d601.jpeg)

最後に、作成した.envファイルにパスワードを記述します。
今回は”1111”としておきますが、自由に変更してください。
```.env
ADMIN_PASSWORD = 1111 
```
### 2.ビューファイルの記述
今回は入力した内容をDBに保存したいわけではないので、form_tagで、methodにpostを指定します。
また、パスワードが一致しなかったときのためにflashメッセージを用意しておきます。
```erb:admin_session.html.erb
<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] %>
```


```erb:admin_index.html.erb
<h1>ここは管理者用メニューです</h1>
```

### 3.ルーティングとコントローラーの設定

##### ルーティング
`hello/admin_authentication`に関しては、`post`（つまり`form_tag`に入力）があったときにはパスワードの認証をするために`hello#admin_authentication`アクションへ、またリロード等で`get`があったときには`hello#admin_session`アクションへ送り、`admin_session.html.erb`を表示させます。
```ruby:routes.rb
#前略
  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`を使ってメッセージを呼び出します。
```ruby:hello_controller.rb
#前略
    
    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

#後略
```
## 参考
- [【Rails】 dotenv-railsを使って環境変数を管理しよう](https://pikawaka.com/rails/dotenv-rails)
- [Railsのflashの使い方をまとめてみた](https://qiita.com/mzmz__02/items/d92a1b735ac91d9c4a46)
- [【Rails】入力されたデータをポストする](https://qiita.com/Hal_mai/items/18fcf239d715ab6790b0)