hibikousinnkibouのブログ

駆け出しプログラマーによる足跡ブログ

商品購入機能及びテストコードの記述

出品された商品を購入する機能を実装。

 

カード決済により発送先住所に送付するためテーブルを2つ作成。

purchase と shipping_adress モデルをターミナルにて作成したが、バリデーションの設定と一つのコントローラーから2つのモデルに指示を出さないように、

form オブジェクトで purchase_shipping_adress モデルを手作成した。

include ActiveModel::Model
attr_accessor :post_code, :prefectures_id, :municipality, :house_number, :building_name,
:phone_number, :token, :user_id, :item_id

と記述することにより、モデルの一部の機能を利用することができて、パラメーターを取得することができる。パラメーターについては、ビュー画面から送られてくるパラメーターを参照して、入力していった。

 

item の show 画面から purchase の index へと遷移した時に、購入する商品の表示をするために、 @item = Item.find(params[:item_id]) としたが、 id の取得が認識されなかった。

結果、ルーティングを item のネストで purchase としないと、 index のルーティングに id が付与されないため以下のように記述した。

resources :items do
  resources :purchases, only: [:index, :create]
end

 

次は、カード決済のためにJavaScriptを記述。

<script type="text/javascript" src="https://js.pay.jp/v1/"></script>
<%= stylesheet_link_tag 'application', media: 'all'%>
<%= javascript_pack_tag 'application' %>

application.html で上記を行い PAY.JP を使用可能にしターボリンクを無効にしてから、

公開鍵とカードのデータと token を取得し、カードデータについては、サーバーサイドが受け取らないように removeAttribute で削除。

purchase コントローラーで秘密鍵と金額と token を取得できるように指定。

ここで、 create したデータを form オブジェクトで save し、それぞれのモデルに渡した。

 

公開鍵と秘密鍵

% vim ~/.zshrc

環境変数にシェルし、

秘密鍵については、

Payjp.api_key = ENV['PAYJP_SECRET_KEY']

と上書き記述してシェルする。

公開鍵に関しては、

% touch config/initializers/webpacker.rb

で webpacker.rb を作成し、

Webpacker::Compiler.env["PAYJP_PUBLIC_KEY"] = ENV["PAYJP_PUBLIC_KEY"]

のみを入力して、

Payjp.setPublicKey(process.env.PAYJP_PUBLIC_KEY);

と上書き記述してシェル。

 

最後に条件分岐で sold out の表記をするのに item.purchase.present? もしくは、 blank? を記述して、コントローラーで url 直接入力を排除して完成。

 

テストコードに関しては、user と item をアソシエーションで紐付けしてないため、FactoryBot で作成して、テストを行なった。

電話番号のバリデーションで誤りがあり修正した。

validates :phone_number, format: { with: /0\d{9,10}/ }

と記述していたが、12桁の番号も通ってしまっていた。

validates :phone_number, format: { with: /\A0\d{9,10}\z/ }

と修正した。

A と Z を記述していないと最初と最後の区切りがないためエラーを検出できない。

バリデーションをかける際には気をつけたい。