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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

799閲覧

findメソッドでidを取り出せない

yuki-natori

総合スコア7

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/07/02 10:45

編集2020/07/02 11:03

前提・実現したいこと

findメソッドでidを取り出したい

Pey.jpを利用した購入機能を実装しています

現状ではひとつ購入してしまうと、他の商品も購入されてしまうため、下記の記述で商品idを取り出そうと試みたのですが、なぜかエラーが起きてしまいます

@item = Item.find(params[:id])

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

イメージ説明

該当のソースコード

purchase_controller(購入コントローラー) class PurchaseController < ApplicationController require 'payjp' def index @item = Item.find(params[:id]) @items = Item.all.includes(:images) @buyer = @items.update_all(buyer_id: current_user.id) 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', #日本円 ) redirect_to action: 'done' #完了画面に移動 end end
item.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

試したこと

@item = Item.find_by(params[:id])
@item = Item.where(params[:id])

上記の記述だと、他の商品も購入されてしまいます

ひとつだけの商品を取り出すために思い当たる原因などはありませんか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/07/02 10:58 編集

idには値が入っていますか?
yuki-natori

2020/07/02 11:06

Yuya-Saudadeさん、反応ありがとうございます! rails c で@itemでしたところnillと返ってくるのですが、 これは値が入っていないということですか?
退会済みユーザー

退会済みユーザー

2020/07/02 11:50

そういうことです。nilは、何も入っていないということです。
yuki-natori

2020/07/03 04:06

Yuya-Saudadeさん ヒント参考に実装にいたることが出来ました ありがとうございました!
退会済みユーザー

退会済みユーザー

2020/07/03 17:48

おめでとうございます!
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 04:04

yuki-natori

総合スコア7

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

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

0

下記の記述で商品idを取り出そうと試みたのですが、なぜかエラーが起きてしまいます

エラーメッセージのとおりです。params[:id]が渡せていません。

投稿2020/07/02 11:08

maisumakun

総合スコア146018

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

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

yuki-natori

2020/07/03 04:07

maisumakunさんの過去の解決記事を参考にして実装できました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問