前提・実現したいこと
現在furimaアプリなるものを製作中で、商品購入機能の実装を行ってます。
Formオブジェクトを用いて複数のテーブルに値を保存したいのですが、値が保存できません。
カード決済にはPayjpを使用しています。
発生している問題・エラーメッセージ
カード情報、住所を入力しても保存できないときの処理が実行され購入画面に遷移します。
バリデーションのエラーメッセージはまだ表示させておりません。
該当のソースコード
purchases_controller.rb
ruby
1class PurchasesController < ApplicationController 2 3 def index 4 @item = Item.find(params[:item_id]) 5 @user_purchase = UserPurchase.new 6 end 7 8 def new 9 @user_purchase = UserPurchase.new 10 end 11 12 def create 13 @user_purchase = UserPurchase.new(purchase_params) 14 @item = Item.find(params[:item_id]) 15 if @user_purchase.valid? 16 pay_item 17 @user_purchase.save 18 return redirect_to root_path 19 else 20 render :index 21 end 22 end 23 24 private 25 26 #def purchase_params 27 #params.permit(:postcode, :area_id, :city, :road, :building, :phone, :token).merge( user_id: current_user.id) 28 #end 29 30 def purchase_params 31 params.require(:user_purchase).permit(:postcode, :area_id, :city, :road, :building, :phone).merge( user_id: current_user.id, token: params[:token], item_id: params[:item_id] ) 32 end 33 34 def pay_item 35 36 Payjp.api_key = ENV["PAYJP_SECRET_KEY"] 37 Payjp::Charge.create( 38 amount: @item.price, 39 card: purchase_params[:token], 40 currency:'jpy' 41 ) 42 end 43 44end
user_purchase.rb
ruby
1class UserPurchase 2 3 include ActiveModel::Model 4 attr_accessor :postcode, :area_id, :city, :road, :building, :phone, :token, :user_id, :item_id, :token 5 6 validates :city, :road, presence: true 7 validates :token, presence: true 8 9 with_options presence: true do 10 validates :area_id, numericality: { other_than: 0, message: 'Select' } 11 validates :phone, format: { with: /\A0[0-9]+\z/, message: 'number is invalid. Include half-width numbers' } 12 validates :postcode, format: { with: /\A\d{3}[-]\d{4}\z/, message: 'is invalid. Include hyphen(-)' } 13 end 14 15 def save 16 Purchase.create(user_id: user_id, item_id: item_id) 17 Address.create(postcode: postcode, area_id: area_id, city: city, road: road, building: building, phone: phone, purchase_id: purchase.id) 18 end 19 20end
試したこと
itemの情報をまずは持ってくる記述をしたらいいと言われ、カリキュラムを確認、調べてみましたが分かりませんでした。
他に必要な情報があればご指摘お願いします。
ご教授よろしくお願いいたします。
追記
修正内容
エラーメッセージはそのまま部分テンプレートを用いて表示することができました。
コントローラーを修正するとフォームに入力した値の取得にも成功しました。(コードに修正箇所のせてます)
現在の状況ですが、フォームを入力して購入ボタンを押してもエラーメッセージは表示されません。
ですがテーブルに値を保存できずindexへ遷移されます。
また別テーブルのitem情報を取得したいのですが、うまくいっておりません。
私が考えているのがuser_purchase.rb内のsaveメソッド内に記述すれば取得できるのではと考えているのですが、うまくいっておりません。
現在方法を調べている段階です。
何かいい方法はありますでしょうか?
補足情報(FW/ツールのバージョンなど)
Ruby 2.6.5
Ruby on Rails 6
回答1件
あなたの回答
tips
プレビュー