なぜActiveRecord::Baseクラスを継承していないUsersControllerクラスでActiveRecord::Baseクラスに含まれるメソッドを使えるのですか?

前提

以下のコードは、ApplicationControllerクラスを継承したUsersControllerクラスのコードです。

ruby

// ファイルの場所:app/controllers/users_controller.rb class UsersController < ApplicationController def show @user = User.find(params[:id]) end def new @user = User.new end # ユーザ登録 def create @user = User.new(user_params) if @user.save log_in @user # ← aplicationコントローラでinclude SessionsHelperしているからuserコントローラでもこのメソッドが使える。 flash[:success] = "Welcome to the Sample App!" redirect_to @user else render 'new' end end def edit @user = User.find(params[:id]) end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) endend

以下のコードは、ApplicationRecordクラスを継承したUserクラスのコードです。

ruby

// ファイルの場所:app/models/user.rb class User < ApplicationRecord attr_accessor :remember_token # データベースに保存される直前にすべての文字列を小文字に変換 before_save { self.email = email.downcase } validates :name, presence: true, length: { maximum:50 } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i validates :email, presence: true, length: { maximum:255 }, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } has_secure_password validates :password, presence: true, length: { minimum: 6 } # 渡された文字列のハッシュ値を返す def User.digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end # ランダムなトークンを返す(パスワード平文) def User.new_token SecureRandom.urlsafe_base64 end # 永続セッションのためにユーザーをデータベースに記憶する def remember self.remember_token = User.new_token update_attribute(:remember_digest, User.digest(remember_token)) end # 渡されたトークンがダイジェストと一致したらtrueを返す def authenticated?(remember_token) return false if remember_digest.nil? BCrypt::Password.new(remember_digest).is_password?(remember_token) end # ユーザーのログイン情報を破棄する def forget update_attribute(:remember_digest, nil) end end

クラスの継承関係

  • UsersControllerクラス

「UsersController < ApplicationController < ActionController::Base」

  • Userクラス

「User < ApplicationRecord < ActiveRecord::Base」

ActiveRecord::Baseクラスのメソッド

  1. User.all
  2. User.new(name: "Example", text: "Hello")
  3. user.save
  4. User.find(1)
  5. user.destroy
  6. user.update

など

質問

「なぜActiveRecord::Baseクラスを継承していないUsersControllerクラスでActiveRecord::Baseクラスに含まれるメソッドを使えるのですか?」

以上、よろしくお願いいたします。

コメントを投稿

0 コメント