はじめに
久しぶりの投稿になります。(最近コーディング以外のことをやっていたせいでqiitaに記事が書けなかった^^;)
ECサイトの開発でrails-admin等の管理者機能作成gemを使わずに、deviseのみを用いて管理者とユーザーのログイン機能を実装した時に思いのほか詰まったので備忘録がてらメモを残しときます。
開発環境
仮想環境:Linux(vagrant)
rails 5.2.3
ruby 2.5.7
##サンプルプロジェクトの作成
まずはrails newでサンプルとなるプロジェクトの作成を行いましょう。
$ rails new devise-sample
これでサンプルプロジェクトの作成完了です。
##deviseのインストール
まずはgemファイルにdeviseを入れてましょう。(私は毎回ファイルの一番下にdeviseを追加しています)
.
.
.
gem 'devise'
$ bundle install
$ rails g devise:install
これでdeviseを使う準備は完了です。
##モデルの作成
ユーザーと管理者のログイン機能を別々に作るために2つのモデルとコントローラーを作成していきたいと思います。
$ rails g devise User
$ rails g devise Admin
マイグレーションファイルが作成されたのでデーターベースに反映させしましょう。
$ rails db:migrate
これでモデルの作成は完了しました。
この時点でサーバーを起動して以下のURLに飛ぶとログインと新規登録画面のページに遷移できます。
ドメイン名/users/sign_in
ドメイン名/users/sign_up
ドメイン名/admins/sign_in
ドメイン名/admins/sign_up
管理者、ユーザーどちらも同じ画面になっているはずです。
##コントローラーとビューの作成
ここでもユーザーと管理者側の機能を分けて作成しましょう。
$ rails g devise:controllers users
$ rails g devise:controllers admins
$ rails g devise:views users
$ rails g devise:views admins
これでadminのログイン画面をいじってみようかな。
<h1>海鮮丼美味しかった</h1> #ここに新規の書き込み
<h2>Log in</h2>
.
.
省略
<% end %>
<%= render "admins/shared/links" %>
あれ?viewの変更が反映されてない!!
##deviseモデルとコントローラーの紐づけ
調べていくとなぜかモデルとコントローラーが紐づいておらず、deviseがモデルを作成した時に隠し持っているviewを表示しているとのこと。困った。
そういえばコントローラーを作った時にコンソールになんか出てたな
$ rails g devise:controllers Admin
Running via Spring preloader in process 23705
create app/controllers/Admin/confirmations_controller.rb
create app/controllers/Admin/passwords_controller.rb
create app/controllers/Admin/registrations_controller.rb
create app/controllers/Admin/sessions_controller.rb
create app/controllers/Admin/unlocks_controller.rb
create app/controllers/Admin/omniauth_callbacks_controller.rb
===============================================================================
Some setup you must do manually if you haven't yet:
Ensure you have overridden routes for generated controllers in your routes.rb.
For example:
Rails.application.routes.draw do
devise_for :users, controllers: {
sessions: 'users/sessions'
}
end
===============================================================================
セットアップはまだ終了しておらずにroutesをFor example:みたいに変えろとのこと。
やってみる。
Rails.application.routes.draw do
devise_for :admins, controller: {
sessions: 'admins/sessions'
}
devise_for :users
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
だめだ、「海鮮丼美味しかった」が表示されない!!
色々解決策をググってみる。
参考になりそうな記事を発見!!
http://katahirado.hatenablog.com/entry/2014/08/16/180718
https://qiita.com/kawasakiatsushi/items/8209a979d86ab3468799
試行錯誤して実装してみた。
Rails.application.routes.draw do
namespace :admins do
devise_for :admins, :controller => {
}
end
devise_for :users
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
再びサーバー立ち上げ。
無事にモデルとコントローラーが紐づいてviewに書き込んだ『海鮮丼美味しかった』が表示できました。
namespaceの影響で
元:ドメイン名/admins/sign_up
今:ドメイン名/admins/admins/sign_up
に変化してしまってます。
他にも管理者とユーザーでログイン、ログアウトのリダイレクト先の設定など、もう一苦労あったのですがそれはまた別の機会に。
##最後に
余談ではありますがgemを用いてコードをブラックボックスとして実装すると応用が効きにくくなるので、gemのソースコードをgitから落として見た方がいいなと感じました。
それではまた!!