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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

496閲覧

rails 購入idを作成したい

yuki-natori

総合スコア7

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/07/02 02:30

編集2020/07/02 04:37

前提・実現したいこと

railsにて商品購入機能を実装しています

現在、クレジット購入時に商品に”購入者id”を付けるために試行錯誤しています

発生している問題・エラーメッセージ

イメージ説明

該当のソースコード

purchase_controller.rb(購入用コントローラー) class PurchaseController < ApplicationController require 'payjp' def index @items = Item.all.includes(:images) card = Card.where(user_id: current_user.id).first #Cardテーブルは前回記事で作成、テーブルからpayjpの顧客IDを検索 if card.blank? #登録された情報がない場合にカード登録画面に移動 redirect_to controller: "card", action: "new" else Payjp.api_key = ENV["PAYJP_PRIVATE_KEY"] #保管した顧客IDでpayjpから情報取得 customer = Payjp::Customer.retrieve(card.customer_id) #保管したカードIDでpayjpから情報取得、カード情報表示のためインスタンス変数に代入 @default_card_information = customer.cards.retrieve(card.card_id) end end def pay card = Card.where(user_id: current_user.id).first Payjp.api_key = ENV['PAYJP_PRIVATE_KEY'] Payjp::Charge.create( :amount => 500, #支払金額を入力(itemテーブル等に紐づけても良い) :customer => card.customer_id, #顧客ID :currency => 'jpy', #日本円 ) @item.update_attribute(buyer_id: current_user.id) redirect_to action: 'done' #完了画面に移動 end end
createItems.rb(マイグレーションファイル) class CreateItems < ActiveRecord::Migration[5.2] def change create_table :items do |t| t.string :name, null: false, index: true t.integer :price, null: false t.text :description, null: false t.integer :condition t.integer :shipping_from, null: false t.integer :days_before_shipping, null: false t.integer :shipping_method, null: false t.integer :brand t.integer :category t.bigint :buyer_id t.references :user, null: false, index: true, foreign_key: true t.timestamps end end end

試したこと

purchase_controller.rbに問題があるのは分かるのですがが

@item.update_attribute(buyer_id: current_user.id)

この一文の書き方が問題で

@buyer = @item.buyer_id

など試しているのですが、上手くいかずエラーになってしまいます

IDを作成するのに他に思い当たる記述はありませんか?

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

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

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

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

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

no1knows

2020/07/02 06:41 編集

status: 1はカラムにもないようですが、何を表しているのでしょうか?
yuki-natori

2020/07/02 04:30

no1knowsさん、反応ありがとうございます! status: 1はコピペしたものを試しに貼り付けてみただけですので、特に意味はありません ``` @item.update_attribute(buyer_id: current_user.id) ``` で最初は試していたのですが、こちらだと undefined method `update_attribute' for nil:NilClass になってしまいます
yuki-natori

2020/07/02 04:39

no1knowsさん すいません、分かりづらかったですよね? 内容を少し編集し直します
guest

回答2

0

自己解決

item.idを持たせるために下記の変更、追記を行いました

購入コントローラーをid取得のために変更

purchase_controller.rb class PurchaseController < ApplicationController require 'payjp' before_action :set_item, only:[:show, :pay] #追記 def show card = Card.where(user_id: current_user.id).first if card.blank? redirect_to controller: "card", action: "new" else Payjp.api_key = ENV["PAYJP_PRIVATE_KEY"] customer = Payjp::Customer.retrieve(card.customer_id) @default_card_information = customer.cards.retrieve(card.card_id) end end def pay card = Card.where(user_id: current_user.id).first Payjp.api_key = ENV['PAYJP_PRIVATE_KEY'] Payjp::Charge.create( :amount => 500, :customer => card.customer_id, :currency => 'jpy', ) @buyer = @item.update(buyer_id: current_user.id) #追記 redirect_to action: 'done' end private #追記 def set_item @item = Item.find(params[:id]) end end

移行前画面のviewにて(@item.id)を追記

= link_to purchase_url(@item.id), class: "btn buy" do

ルーティングにて'pay'から'/pay/:id'に変更しidを持たせる

rout.rb resources :purchase, only: [:show] do collection do get 'show', to: 'purchase#show' post '/pay/:id', to: 'purchase#pay' get 'done', to: 'purchase#done' end end

投稿2020/07/03 03:59

yuki-natori

総合スコア7

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

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

0

IDを作成するのに他に思い当たる記述はありませんか?

勘違いされているのだと思いますが、undefined method 'update_attribute' for nil:NilClassは、NilClassのnilオブジェクトに対して、update_attributeメソッドは定義されていないよ!ってことです。

つまり、@itemがnilになっているので、それを取得するコードが必要になります。

投稿2020/07/02 06:46

no1knows

総合スコア3365

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

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

yuki-natori

2020/07/03 04:03 編集

no1knowsさん 何とか、他の記事などを参考にし実装することが出来ました ヒント頂きありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問