[Rails]ゲストログイン機能(ルーティングヘルパーメソッド,名前空間)
ゲストログイン機能の実装にあたり、自分が疑問に感じた点だけをまとめてます。ご注意ください。
モデル
モデルに以下を書く
class User < ApplicationRecord
GUEST_USER_EMAIL = "guest@example.com"
def self.guest
# (1)
find_or_create_by!(email: GUEST_USER_EMAIL) do |user|
# (2)
user.password = SecureRandom.urlsafe_base64
user.name = "guestuser"
end
end
end
(1) find_or_create_by
データの検索と作成を同時に行うメソッド。
find_or_create_by(条件)
でデータがなけれなば作成、ある場合はデータを返す。
(2) SecureRandom.urlsafe_base64
SecureRandom.urlsafe_base64
はランダムな文字列を作成するメソッド。
今回出たエラー
Started GET "/users/sign_in" for 127.0.0.1 at 2025-03-04 08:35:12 +0900
ActionController::RoutingError (uninitialized constant Public::SessionsController
candidate = constant.const_get(name)
^^^^^^^^^^
raise MissingController.new(error.message, error.name)
^^^^^):
ログアウト・ログインのリンクをクリックすると上記が出るようになった。
sessionコントローラをusersフォルダに移動させたことが原因だと思う。
今回はもともとsessionコントローラがあったため、usersフォルダに移動させると、ログインや新規登録のリンクが動かなくなる不具合が発生したため、usersフォルダに移動せずpubricフォルダのまま進めました。
ルーティングヘルパーメソッド
今回のエラーを対応するにあたって、ルーティングヘルパーメソッドを理解してないことが分かった。
出てきたものをまとめていきます。
devise_for
(Devise のルーティング設定)
1. 意味
devise_for
は Devise が提供するルーティングを自動生成するためのメソッド。
これを使うことで、ログイン・ログアウト・新規登録などのルートを一括定義 できる。
# 3行目
devise_for :admin, skip: [:registrations, :password], controllers: {
sessions: "admin/sessions"
}
# 30行目
devise_for :users, controllers: {
registrations: 'public/registrations',
}
💡 何をしているか?
-
devise_for :admin
-
admin
ユーザーの 認証ルートを作成(例:/admin/sign_in
など) -
skip: [:registrations, :password]
→ 管理者は新規登録やパスワードリセットをできない -
controllers: { sessions: "admin/sessions" }
→ ログイン処理 (sessions
) だけカスタムコントローラーを使用
-
-
devise_for :users
-
users
用の 認証ルートを作成 -
controllers: { registrations: 'public/registrations' }
→ 新規登録 (registrations
) だけカスタムコントローラーを使用 -
ログイン (
sessions
) のカスタマイズはしていない(デフォルトのdevise/sessions
を使用)
-
参考文献
Rails Guide(ルーティング)
Devise の公式ドキュメント(Routing)
devise_scope
(Devise ルートのカスタマイズ)
2. 意味
devise_scope
は、devise_for
のルートをさらにカスタマイズしたいときに使う メソッド。
# 7行目
devise_scope :user do
get '/users/sign_out' => 'devise/sessions#destroy'
post "users/guest_sign_in", to: "public/sessions#guest_sign_in"
end
💡 何をしているか?
-
get '/users/sign_out' => 'devise/sessions#destroy'
-
/users/sign_out
に GET リクエストを送ると、ログアウト処理 (devise/sessions#destroy
) が実行される - ただし、Devise はデフォルトで
DELETE /users/sign_out
を使うため、GET に変更するのは 非推奨
-
-
post "users/guest_sign_in", to: "public/sessions#guest_sign_in"
-
/users/guest_sign_in
にPOST
すると、ゲストログイン処理 (public/sessions#guest_sign_in
) を実行 - Devise の標準ルートにないカスタムルートを追加
-
参考文献
Devise の公式ドキュメント(Routing のカスタマイズ)
scope module:
(ネームスペースなしでコントローラーを整理)
3. 意味
scope module: "xxx"
は、URL は変更せず、コントローラーの名前空間 (module
) だけを変更する。
# 25行目
scope module: :public do
root to: "homes#top"
get 'about', to: 'homes#about', as: 'about'
get 'search', to: 'tasks#search'
end
💡 何をしているか?
-
scope module: :public
により、以下のルートをPublic::
名前空間のコントローラーに紐付け-
/
→Public::HomesController#top
-
/about
→Public::HomesController#about
-
/search
→Public::TasksController#search
-
この設定がない場合、homes#top
は ApplicationController
を継承した HomesController
を探してしまう。
参考文献
Rails Guide(ルーティング) - 名前空間とスコープ
namespace
(URL もコントローラーも変更)
4. 意味
namespace "xxx"
は、URL に xxx/
を追加し、コントローラーの名前空間も xxx::
に変更 する。
# 12行目
namespace :admin do
resources :users, only: [:destroy]
resources :dashboards, only: [:index] do
collection do
get :search
end
end
resources :comments, only: [:index, :destroy]
resources :tasks, only: [:index, :destroy]
end
💡 何をしているか?
-
namespace :admin
により、URL に/admin/
が追加-
/admin/users/:id
→Admin::UsersController#destroy
-
/admin/dashboards
→Admin::DashboardsController#index
-
/admin/comments
→Admin::CommentsController#index
-
📌 これにより、通常の UsersController
と Admin::UsersController
を分けられる
参考文献
Rails Guide(ルーティング) - 名前空間
resources
(CRUD のルートを一括生成)
5. 意味
resources
は、CRUD(Create, Read, Update, Delete)のルートを一括定義する。
# 34行目
resources :tasks, only: [:new, :create, :index, :show, :edit, :update, :destroy] do
resource :favorite, only: [:create, :destroy]
resources :task_comments, only: [:create, :destroy], as: "comments"
end
💡 何をしているか?
-
/tasks/
に対する CRUD のルートを作成 -
resource :favorite
でtasks/:task_id/favorite
という「単一のお気に入り」ルートを作成 -
resources :task_comments
でtasks/:task_id/comments
のルートを作成
参考文献
Rails Guide(ルーティング) - resources
の使い方
まとめ
設定 | 役割 |
---|---|
devise_for | Devise のルートを一括生成 |
devise_scope | Devise のルートをカスタマイズ |
scope module: | URL を変えずに名前空間を適用 |
namespace | URL に /xxx/ を追加し、コントローラーの名前空間を変更 |
resources | CRUD のルートを一括生成 |
「名前空間」とは?
名前空間(ネームスペース、namespace)とは、クラスやモジュールを整理して管理するための仕組み。
簡単に言うと、「同じ名前のクラスやメソッドがあっても、区別できるようにするもの」 。
📌 例:名前空間がない場合
たとえば、UsersController
っていうコントローラーがあったとする。
class UsersController < ApplicationController
def index
@users = User.all
end
end
でも、もし 管理者(admin)用の UsersController
も作りたい となったら
そのまま UsersController
って名前で作ると、どっちの UsersController
かわからなくなる 。
📌 例:名前空間を使う場合
そこで、namespace :admin
を使って管理者用のコントローラーを作る ことで、区別できるようになる。
namespace :admin do
resources :users, only: [:index, :destroy]
end
こうすると、Admin::UsersController
っていう「管理者専用の UsersController
」を作れる。
class Admin::UsersController < ApplicationController
def index
@users = User.all
end
end
namespace
の効果
-
URL も変わる
-
/users
→UsersController
-
/admin/users
→Admin::UsersController
-
-
クラス名が変わる
UsersController
Admin::UsersController
- どの
UsersController
を使うか、Rails がちゃんと判断できる
scope module:
と namespace
の違い
📌 方法 | URL | コントローラー |
---|---|---|
namespace :admin | /admin/users | Admin::UsersController |
scope module: :admin | /users | Admin::UsersController |
📌 namespace
は URL に admin/
を追加 する。
📌 scope module:
は URL はそのままで、内部的に Admin::
を付ける。
scope module: :public do
get 'about', to: 'homes#about'
end
例えば、上記だと /about
がついたURLになるけど、実際には Public::HomesController
が使われる。
Discussion