Yuya8888
@Yuya8888 (裕也)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

オリジナルアプリでPAY.JPを用いた購入機能を追加したいです。

解決したいこと

購入機能を追加するため、HTML、CSSは完成したのですが、購入ボタンをクリックしても反応しない。
原因はある程度わかっていて、検証ツールで購入ボタンの要素を確認すると、
6FC11EB2-3F6E-4AC4-827A-F1987860F5A2.jpeg
画像の通り『disable』となってしまっています。
ちなみに購入ボタンをクリックする前は『disable』の表示は無いです。
ボタンをクリックするとこうなってしまう原因が突き止められていません。

views/orders/index.html.erb

<div class='transaction-contents'>
  <div class='transaction-main'>
    <h1 class='transaction-title-text'>
      購入内容の確認
    </h1>


    <%= form_with model:@order, url: movie_orders_path, id: 'charge-form', class: 'transaction-form-wrap',local: true do |f| %>
      <%= render 'shared/error_messages', model: f.object %> 
      <div class='credit-card-form'>
        <h1 class='info-input-haedline'>
          クレジットカード情報入力
        </h1>
        <div class="form-group">
          <div class='form-text-wrap'>
            <label class="form-text">カード情報</label>
            <span class="indispensable">必須</span>
          </div>
          <%= f.text_field :number, class:"input-default", id:"card-number", placeholder:"カード番号(半角英数字)", maxlength:"16" %>
          <div class='available-card'>
            <%= image_tag 'card-visa.gif', class: 'card-logo'%>
            <%= image_tag 'card-mastercard.gif', class: 'card-logo'%>
            <%= image_tag 'card-jcb.gif', class: 'card-logo'%>
            <%= image_tag 'card-amex.gif', class: 'card-logo'%>
          </div>
        </div>
        <div class="form-group">
          <div class='form-text-wrap'>
            <label class="form-text">有効期限</label>
            <span class="indispensable">必須</span>
          </div>
          <div class='input-expiration-date-wrap'>
            <%= f.text_area :exp_month, class:"input-expiration-date", id:"card-exp-month", placeholder:"例)3" %>
            <p>月</p>
            <%= f.text_area :exp_year, class:"input-expiration-date", id:"card-exp-year", placeholder:"例)23" %>
            <p>年</p>
          </div>
        </div>
        <div class="form-group">
          <div class='form-text-wrap'>
            <label class="form-text">セキュリティコード</label>
            <span class="indispensable">必須</span>
          </div>
          <%= f.text_field :cvc,class:"input-default", id:"card-cvc", placeholder:"カード背面4桁もしくは3桁の番号", maxlength:"4" %>
        </div>
      </div>

      <div class='shipping-address-form'>
        <h1 class='info-input-haedline'>
          配送先入力
        </h1>
        <div class="form-group">
          <div class='form-text-wrap'>
            <label class="form-text">郵便番号</label>
            <span class="indispensable">必須</span>
          </div>
          <%= f.text_field :postal_code, class:"input-default", id:"postal-code", placeholder:"例)123-4567", maxlength:"8" %>
        </div>
        <div class="form-group">
          <div class='form-text-wrap'>
            <label class="form-text">都道府県</label>
            <span class="indispensable">必須</span>
          </div>
          <%= f.collection_select(:prefecture_id, Prefecture.all, :id, :name, {}, {class:"select-box", id:"item-prefecture"}) %>
        </div>
        <div class="form-group">
          <div class='form-text-wrap'>
            <label class="form-text">市区町村</label>
            <span class="indispensable">必須</span>
          </div>
          <%= f.text_field :municipalities, class:"input-default", id:"city", placeholder:"例)横浜市緑区"%>
        </div>
        <div class="form-group">
          <div class='form-text-wrap'>
            <label class="form-text">番地</label>
            <span class="indispensable">必須</span>
          </div>
          <%= f.text_field :address, class:"input-default", id:"addresses", placeholder:"例)青山1-1-1"%>
        </div>
        <div class="form-group">
          <div class='form-text-wrap'>
            <label class="form-text">建物名</label>
            <span class="form-any">任意</span>
          </div>
          <%= f.text_field :building_name, class:"input-default", id:"building", placeholder:"例)柳ビル103"%>
        </div>
        <div class="form-group">
          <div class='form-text-wrap'>
            <label class="form-text">電話番号</label>
            <span class="indispensable">必須</span>
          </div>
          <%= f.text_field :phone_number, class:"input-default", id:"phone-number", placeholder:"例)09012345678",maxlength:"11"%>
        </div>
      </div>
      <div class='buy-btn'> 
        <%= f.submit "購入" ,class:"buy-red-btn"%>
      </div>
    <% end %>
  </div>
</div>

javascript/card.js

const pay = () => {
  Payjp.setPublicKey(process.env.PAYJP_PUBLIC_KEY);
  const form = document.getElementById("charge-form");
  form.addEventListener("submit", (e) => {
    e.preventDefault();

    const formResult = document.getElementById("charge-form");
    const formData = new FormData(formResult);

    const card = {
      number: formData.get("buyer_order[number]"),
      cvc: formData.get("buyer_order[cvc]"),
      exp_month: formData.get("buyer_order[exp_month]"),
      exp_year: `20${formData.get("buyer_order[exp_year]")}`,
    };
    console.log(card)

    Payjp.createToken(card, (status, response) => {
      if (status === 200) {
        const token = response.id;
        const renderDom = document.getElementById("charge-form");
        const tokenObj = `<input value=${token} name='card_token' type="hidden">`;
        renderDom.insertAdjacentHTML("beforeend", tokenObj);

        document.getElementById("card-number").removeAttribute("name");
        document.getElementById("card-exp-month").removeAttribute("name");
        document.getElementById("card-exp-year").removeAttribute("name");
        document.getElementById("card-cvc").removeAttribute("name");

        document.getElementById("charge-form").submit();
      }
    });
  });
};

window.addEventListener("load", pay);

models/buyer_order.rb

class BuyerOrder
  include ActiveModel::Model
  attr_accessor :user_id,:movie_id,:postal_code,:prefecture_id,:municipalities,:address,:building_name,:phone_number,:token
  with_options presence: true do
    validates :user_id
    validates :movie_id
    validates :postal_code,format:{with:/\A\d{3}[-]\d{4}\z/}
    validates :prefecture_id, numericality: { other_than: 1}
    validates :municipalities,format:{with:/\A[一-龥ぁ-ん]/}
    validates :address
    validates :phone_number,format:{with:/\A\d{11}\z/}
    validates :token
  end

  def save
    order = Order.create(user_id: user_id,movie_id: movie_id)
    Address.create(postal_code: postal_code,prefecture_id: prefecture_id,municipalities: municipalities,address:address, building_name:building_name,phone_number: phone_number,order_id: order.id)
  end
end

自分で試したこと

一度『id: 'charge-form'』を削除して購入ボタンをクリックしたら、『Token can't be blank』と表示されましたが、
購入ボタンとして一応機能していました。
ただ、idを削除してしまったので、そもそもJavaScriptでtokenが作成されません。
これでは購入できないので、どうしたら良いのか調べても解決しませんでした。
わかる方いらっしゃいましたらよろしくお願いいたします。

0

No Answers yet.

Your answer might help someone💌