🍿

管理者機能の実装してみるよ その1(初心者)

2024/04/13に公開

はじめに

とうとう社会人になってしまった元大学生です。
社会人生活、2週間を終えましたが、いまのところは楽しいです。同期ともすごく仲良くなりプライベートでも話したりします。
そして、新しめのMacが配布されてウハウハしてました笑

そこで、久しぶり何か更新でもしようかなと思いアドミン機能の追加について記事にします。

管理者ログインの機能を実装

モデルの作成

まず最初にAdminモデルを作成します。

rails g devise Admin

Adminモデルを作成したら次にコントローラーを作っていきます。

コントローラー

管理者として処理するために独自のコントローラーをDevise用コントローラーとして作成します。

rails g devise:controllers admin

上記のコマンドを打つと、controllersの配下にadminフォルダが作成され、ファイルが作成されます。

ルーティングを設定

管理者のログイン画面では/admin/sign_inというURLになるようにルーティングを設定していきます。

config/routes.rb
Rails.application.routes.draw do
- devise_for :admims #こちらは、削除

+ devise_for :admin, skip: [:registrations, :password], controllers: {
+  sessions: 'admin/sessions'
+ }

end

上記の記載ができたら、Viewを作成していきます。

Viewの編集

管理者用のDeviseのViewファイルを以下のコマンドで作成します。

rails g devise:views admins

コマンドの実行が完了すると、app/views/admins/ディレクトリにDevise関連のviewファイルが作成されます。 そして、作成されたadminsというフォルダ名をadmin` に変更してください。

次に、app/views/admin/sessions/new.html.erbのみ修正を行います。

app/views/admin/sessions/new.html.erb
- <%= render "admins/shared/links" %> こちらのファイルパスを変更します。
+ <%= render "admin/shared/links" %>

そして、Deviseで作成されるViewファイルのフォームヘルパーはform_forと記載されているので、現在推奨されているform_withというコードに変更します。

app/views/admin/sessions/new.html.erb

<%- if controller_name != 'sessions' %>
  <%= link_to "Log in", new_session_path(resource_name) %>
<% end %>

--------------------------------ここから削除--------------------------------
<%- if devise_mapping.registerable? && controller_name != 'registrations' %>
  <%= link_to "Sign up", new_registration_path(resource_name) %>
<% end %>

<%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
  <%= link_to "Forgot your password?", new_password_path(resource_name) %>
<% end %>

<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
  <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %>
<% end %>

<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
  <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %>
<% end %>

<%- if devise_mapping.omniauthable? %>
  <%- resource_class.omniauth_providers.each do |provider| %>
    <%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider), method: :post %>
  <% end %>
<% end %>
--------------------------------ここまで削除--------------------------------

削除ができたら、次にマイグレーションを実行していきます。

マイグレーションの実行

rails db:migrate

上記のコマンドを打ったら、次にRails cで管理者ユーザーを作成します。
以下のコマンドをrails cで実行してください

Admin.create!(email: 'admin@example.com', password: 'password', password_confirmation: 'password')

これでユーザーが作成することができ、/admin/sign_inのパスにアクセスするとログインすることができます。

ログインとログアウトの遷移先を指定

遷移先に関しては、admin/sessions_controller.rのファイル内で設定します。

admin/sessions_controller.rb
class Admin::SessionsController < Devise::SessionsController

    protected
    
+   def after_sign_in_path_for(resource) 
+     admin_dashboards_path #ログイン後にリダイレクトするパス
+   end
    
+   def after_sign_out_path_for(resource_or_scope)
+     new_admin_session_path #ログアウト後にリダイレクトするパス
+   end

end

上記の内容で管理者のログイン機能が実装できました。

まとめ

今回は、管理者のログイン機能について実装しました。

管理者の機能に関しては、次の記事で記載していきます。
またわからないことがありましたら自身でググってみてください。

Discussion