質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2467閲覧

Formオブジェクトを用いて複数のテーブルに値を保存する

kojiro23

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2020/09/30 04:31

編集2020/10/01 08:53

前提・実現したいこと

現在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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2020/09/30 07:42

index に回された時、  @user_purchase.errors の内容を表示するようになっていないのでは? render :index の直前で @user_purchase.errors.messages の内容を確認してください
kojiro23

2020/09/30 09:26

ありがとうございます。 エラーメッセージの表示は部分テンプレートを使用するので記述は以下のようになります。 <%= render 'shared/error_messages', model: f.object %> 紛らわしく申し訳ございません。 しかしエラーメッセージを表示させようとしたら下記のエラーが表示され undefined method `errors' for nil:NilClass 下記を参考にエラーメッセージ表示させることはできるようになりましたが、今度は値が取得できなくなりました。 https://teratail.com/questions/250780 自分の知識不足で定義方法が他に思いつかなかったため、間違えているかもしれません。 他に何か考えられることがあるでしょうか? 変更したところは書き換えておきます。 よろしくお願いします。
winterboum

2020/09/30 21:14

partialを使うのは後にして、ここはダイレクトに <%= @user_purchase.errors.full_messages.join %> で表示させましょう エラーが変わったのなら、そのエラーメッセージとその時のcodeを載せてください。
kojiro23

2020/10/01 08:16

お忙しい中ありがとうございます。 追記にも説明はさせて頂いていますが エラーメッセージ問題は解決できました。 あとは入力した値が各テーブルに保存ができない問題と、別テーブルのitem情報の取得方法を考えているところです。 現在調べている段階です。 何かいい方法はありますでしょうか?
guest

回答1

0

自己解決

user_purchase.rbのsaveメソッドの記述を変え、addressテーブルの足りないカラムを追加すれば解決しました。
あとはコントローラーのpayjpの処理の中にitemを定義すればpayjpの処理もうまくいきました。

一応カリキュラムの内容も含まれているので自分が解決したかった箇所以外は消しておきます。

お忙しい中お力添えいただきありがとうございます。

投稿2020/10/01 08:58

kojiro23

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問