どっちに潜る? 間違えたら、嘘のツリーを出してしまう 管理画面のアクションを起点に実行して、 User.all の定義をアプリケーションコードから探したい: $ bundle exec call_map Admin::UsersController#index # 管理画面のコントローラ (Admin::UsersController) def index @users = User.all # ← この User の定義に潜りたい end # app/models/user.rb class User < ApplicationRecord # ① 一般ユーザー end # app/models/admin/user.rb module Admin class User < ApplicationRecord # ② 管理者 end end
に解決される コード上に module Admin のブロックが無いので、 Admin の中は探索されない → ①( 一般ユーザー) に解決される Ruby は定数を、ソース上で囲んでいるブロックを内から外へ探す。 つまり解決先は、呼び出しの中身ではなく周りの書き方で決まる コントローラは、どちらも同じ Admin::UsersController 。でも、書き方が2 通りある: # module Admin のブロックで書かれていたら module Admin class UsersController def index @users = User.all # → ② Admin::User end end end # 「1 行で」書かれていたら class Admin::UsersController def index @users = User.all # → ① 一般ユーザー! end end
全ページログイン必須 end class LpController < ApplicationController skip_before_action :authenticate_user! # LP は公開ページなので外す end class MemberLpController < LpController before_action :authenticate_user! # 会員限定LP だけ、再びログイン必須 → 動く! end