クレジットカード決済用JavaScript準備 ⑦ tokenの値もOrderモデルで取り扱えるようにしましょう


app/models/order.rb
class Order < ApplicationRecord
  attr_accessor :token
  validates :price, presence: true
end

attr_accessor

値別 基本構文
# シンボルの場合 attr_accessor :インスタンス変数名
# 文字列の場合 attr_accessor 'インスタンス変数名'

attr_accessorとは、インスタンス変数の読み取り専用のメソッドと書き込み専用のメソッド(セッター/ゲッター)の両方を定義することが出来るメソッドのことです。Rubyでは、以下のコードのように記述してクラス外部からインスタンス変数にアクセスしようとすると、「インスタンス変数にアクセスするためのメソッドが定義されていない」というエラーが発生します。これにより、クラス外部からのインスタンス変数の参照や変更が出来ません。
このように、attr_accessorメソッドはインスタンス変数にアクセスするためのメソッドを裏側で定義してくれます。そして、attr_accessorメソッドに指定されたインスタンス変数は、クラス外部から参照と変更の両方を行う事が出来ます。

attr_accessorメソッドを定義して各インスタンス変数にアクセスした場合-->
class User
  attr_accessor :name, :age # この記述で@name,@ageへアクセス出来る

  def initialize(name, age)
    @name = name
    @age = age
  end
end

tanaka = User.new('田中太郎', 18)

tanaka.age = 33

参考:Pikawaka 【Ruby】attr_accessorメソッド初心者入門書~使い方と必要な理由を理解しよう
http://pikawaka.com/ruby/attr_accessor

モデルのバリデーション

tokenはordersテーブルに存在しないため、本来はOrderモデルのバリデーションとしては記載することはできません。しかしながら、前のステップでattr_accessor :tokenと記載したことにより、tokenについてのバリデーションを記述することができます。

spec/factories/orders.rb
class Order < ApplicationRecord
  attr_accessor :token
  validates :price, presence: true
  validates :token, presence: true
end