RoRにてポートフォリオを作成中
rails tutorialの9章を参考に、セッションを保持できる機能を作成しております。
その際に、気になるコードがありましたので、どなたかご回答していただければと思います。
Userrb
1class User < ApplicationRecord 2 # 仮想的なremember_token属性を追加 3 attr_accessor :remember_token 4 5 before_save { self.email = email.downcase } 6 validates :name, presence: true, length: { maximum: 50 } 7 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i.freeze 8 validates :email, presence: true, length: { maximum: 255 }, 9 format: { with: VALID_EMAIL_REGEX }, 10 uniqueness: { case_sensitive: false } 11 validates :password, presence: true, length: { minimum: 6 } 12 has_secure_password 13 mount_uploader :image, ImageUploader 14 15 # 渡された文字列のハッシュ値を返す 16 def self.digest(string) 17 cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 18 BCrypt::Engine.cost 19 BCrypt::Password.create(string, cost: cost) 20 end 21 22 # ランダムな文字列でトークンを返す 23 def self.new_token 24 SecureRandom.urlsafe_base64 25 end 26 -----------------------------------------------------------------↓下記コードについて 27 # 永続セッションのためにユーザーをデータベースに記憶する 28 def remember 29 self.remember_token = User.new_token 30 update_attribute(:remember_digest, User.digest(remember_token)) 31 end 32 33 def authenticated?(remember_token) 34 BCrypt::Password.new(remember_digest).is_password?(remember_token) 35 end 36 ----------------------------------------------------------------- 37end
User
1 def remember 2 self.remember_token = User.new_token 3 update_attribute(:remember_digest, User.digest(remember_token)) 4 end
self.remember_tokenについて、tutorialではself.をつけないとローカル変数となると記述あり。
私の理解ではattr_accessorで追加した属性はUserに紐づいたもので、self.をつけない場合、何に紐づいた属性かRubyが判断できないため、期待した動作ができないと考え納得したつもりです。(表現の仕方がおかしいかもしれません。)
そのため、self.もしくは(今回の場合は)User.を記述しないと属性にアクセスできないと要約しました。
その際に、
User
1update_attribute(:remember_digest, User.digest(remember_token))
上記コード部分でUser.digest(remember_token)
としており、このように記述した場合、ローカル変数のremember_toeknを探しに行ってしまうと思い下記の通りに修正した場合との動作の比較をしました。
User
1update_attribute(:remember_digest, User.digest(self.remember_token))
コンソール上では、動作に変わりはありませんでした。
なぜ、tutorialではself.をつけないコードを掲載したのかその意図が気になり質問しました。
(属性を引数に渡す場合は、self.の省略可能?
rubyはローカル変数にない場合は、変数の種類を問わず、他に同じ名前の変数が存在しないか探しに行くのか?)
それとも、
self.remember_token = User.new_token
この部分は、代入ではなくremember_tokenへのセッターメソッドであり、
User
1update_attribute(:remember_digest, User.digest(remember_token))
ここで、ゲッターメソッドを呼び出したのか
この考え方の場合は、セッターメソッドを呼び出す時はself.をつけて、ゲッターメソッドを呼び出す時はclass内で定義する場合は、self.が省略可能なことから、self.なしでそのまま呼び出せることなのか
おそらくアクセスメソッドの理解が不十分なことが原因と思いますが、頭の整理ができません(すいません)
以上、ご回答のほどよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/28 06:21