7/21(火) 本日の学び

また今日も理解することができ、コードが書くことができて本当に本当に嬉しい。

 

createアクションでは2つの保存作業が行われる。

1.payjpにトークンと顧客情報を結び付けて保存する処理
2.DBのCredit_cardsテーブルのカラムに値を保存する処理

保存の状態によってまた処理が分岐する。
1.成功したらredirect_toでindexに戻る
2.失敗したらrenderでnewに戻る

 

それらをコードで書くとこう

def new # Webの支払い方法をクリックするとnewに飛ぶ。
  card = Credit_card.where(user_id:current_user.id).first
  redirect_to action: "index" if @card.present? # indexは今途中まで書けてます
end

def create # newのweb上に追加ボタンがあってそれを押すとcreateへ飛ぶ
  Payjp.api_key = 'PAYJP_ACCESS_KEY'# 秘密鍵
    if params['payjp-token'].blank? # blankだったらもう一度newで登録画面へ
      redirect_to action: "new"
    else
     customer = Payjp::Customer.create( # これはpayjpにトークンと顧客情報を結びつける処理(定型文)
     description:'test', # PAY.JPの顧客情報に表示する概要になるらしい。なくても良い
     email: current_user.email,# ログイン中のユーザーのemailをキーにセット
     card: params['payjp-token'], # 直前のnewアクションで発行され送られてくるトークンをcardにセット
     metadata: {user_id:current_user.id}
   )

    @card = Credit_card.new(user_id: current_user.id, customer_id: customer.id,card_id: customer.default_card) #DBに顧客情報を登録
    if @card.save
      redirect_to action: "index", notice:"支払い情報の登録が完了しました"
    else
      render new
    end
  end

 
なんとか水曜日目標のカードを登録するための処理は書き終えたので、
残すはindex(これは登録したカード一覧を表示するページ)と
destroy(登録したカードの削除)となります。
これも水曜日までに書き終えられそうです。

ちなみにindexはここまで書けました。

 def index
    #カードが存在(登録)しているかどうか確認し、あればPAY.JPからカード情報にアクセスして取得
    if @card.present?
      Payjp.api_key = ENV['PAYJP_PRIVATE_KEY'] #秘密鍵をセットする
      customer = Payjp::Customer.retrieve(@card.payjp_id)#PAY.JPに登録されているカード情報のidに紐づく@cardを探してる
      @card_info = customer.cards.retrieve(customer.default_card)# PAY.JPの顧客情報からデフォルトで使うクレジットカードを取得する。
      #クレジットカード情報から表示させたい情報を定義する。
      #PAY.JPの中にオブジェクト(支払い、顧客、カードなど)があり、さらにそれに対応する値がキーバリュー形式で保存されている。
      #.brandや.last4といったようにドットでつなげることで、ほしいバリューを取得できる
      @card_brand = @card_info.brand #クレジットカードの画像を表示するためにカード会社を取得
      @exp_month = @card_info.exp_month.to_s #カードの有効期限を取得
      @exp_year = @card_info.exp_year.to_s.slice(2,3) # 年は最後の下2桁をsliceメソッドを使って取り出す

      # この後各カード会社のimageをそれぞれファイルに突っ込んで、そのファイルを変数に代入するコードを書く



  end