【プログラミング】 (Ruby on Rails)undefined method `activation_token=’ for # Did you mean? activated=の修正方法

Ruby on Railsチュートリアル第11章まで学習が進みました。

この章の冒頭で紹介されているメイラー構築作業でテストエラーが何度も発生していたため、解消方法を記載しておきます。

 

【エラー名称】

undefined method `activation_token=’ for #<User:0x00007fb96417e3a8> Did you mean? activated=

 

【改善方法】

※単なる記述漏れ

アプリ名/app/models/user.rb内のコードに記述漏れがあったため、エラー発生したことを確認。

class User < ApplicationRecord
  #以下が記述漏れのコード( , :activation_token ) の記述漏れ
  attr_accessor :remember_token
  #↓このコードを下の内容に変更する
  #以下が正解のコード
  attr_accessor :remember_token, :activation_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: true
  has_secure_password
  validates :password, presence: true, length: { minimum: 6 }, allow_nil: true

  # 渡された文字列のハッシュ値を返す
  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

  private

    #メールアドレスをすべて小文字にする
    def downcase_email
      self.email = email.downcase
    end

    #有効化トークンとダイジェストを作成および代入する
    def create_activation_digest
      self.activation_token = User.new_token
      self.activation_digest = User.digest(activation_token)
    end

end

attr_accessor :remember_token, :activation_token

 

上の, :activation_tokenが記述されていないせいで、メイラーテスト実行時にエラーを発生させてしまうため、コーディングは漏れがないように注意する必要があります。

この記事も人気ですよ