@miyotake31859

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!

Unpermitted parameters: どうしたら???

解決したいこと

カード情報を受け取り、保存する

例)
カード決済機能の実装しています
購入画面で、購入を押すと
保存できず、indexを再読み込みしています

発生している問題・エラー

カード情報が受け取れていない

例)

Unpermitted parameters: :card_number, :exp_mouth, :exp_year, :cvc

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

card.js
const pay = () => {
  const payjp = Payjp(process.env.PAYJP_PUBLIC_KEY)
  const submit = document.getElementById("button");
  submit.addEventListener("click", (e) => {
    e.preventDefault();
    
    const formResult = document.getElementById("charge-form");
    const formData = new FormData(formResult);

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

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

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

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

window.addEventListener("load", pay);

orders_controller.rb
class OrdersController < ApplicationController

  before_action :set_item, only: [:index, :create]
  def index
    @order = Order.new
    @order_payment = OrderPayment.new
  end

  def create  
    binding.pry
      @order_payment= OrderPayment.new(order_params)
    if @order_payment.valid?
      pay_item
      @order_payment.save
      redirect_to root_path
    else
      render :index
    end
  end
  


  private

  def set_item
    @item = Item.find(params[:item_id])
  end

  def order_params
    params.require(:order_payment).permit(:post_code, :prefecture_id, :city, :block, 
                               :building, :phone_number)
                           .merge(user_id: current_user.id, item_id: @item_id, token: params[:token]) 
end


  def pay_item
    Payjp.api_key = ENV["PAYJP_SECRET_KEY"]
    Payjp::Charge.create(
      amount: @item.price,
      card: order_params[:token],
      currency:'jpy'
    )
 end
end


order_payment.rb
class OrderPayment < ApplicationRecord
  include ActiveModel::Model
  attr_accessor :user_id, :item_id, :post_code, :prefecture_id, :city, :block, :building, :phone_number, :token

  with_options presence: true do
  
    validates :user_id
    validates :item_id
 
    validates :post_code, format: { with: /\A[0-9]{3}-[0-9]{4}\z/, message: 'is invalid. Include hyphen(-)' }
    validates :prefecture_id, numericality: { other_than: 0, message: "can't be blank" }
    validates :city
    validates :block
    validates :phone_number, format: { with: /\A\d{10,11}\z/, message: 'is invalid' }

    validates :token

  end

  def save
    order = Order.create(user_id: user_id, item_id: item_id)
    Payment.create(order_id: order.id, post_code: post_code, prefecture_id: prefecture_id,
                    city: city, block: block, building: building, phone_number: phone_number, order_id: order.id)
  end
end

自分で試したこと

card.jsのid確認、
controlllerの確認
params確認

0 likes

No Answers yet.

Your answer might help someone💌