【问题标题】:Couldn't find Product without an ID找不到没有 ID 的产品
【发布时间】:2019-05-11 13:28:58
【问题描述】:

我在 PaymentsController#create 错误/找不到没有 ID 的产品中收到 ActiveRecord::RecordNotFound

我正在尝试设置 Stripe 付款,但在提交信用卡后出现错误。我正在为 Rails 简介课程做这个,我的同学有相同的代码,但他们的代码正在运行。

看来错误在这一行:

@product = Product.find(params[:product_id])

这是我的付款控制器:

class PaymentsController < ApplicationController

  def new
    @product = @product.payments.new
  end

  def create
    token = params[:stripeToken]
    @product = Product.find(params[:product_id])
    @user = current_user
    # Create the charge on Stripe's servers - this will charge the user's card

    begin
      charge = Stripe::Charge.create(
        amount: (@product.price*100), # amount in cents, again
        currency: "usd",
        source: token,
        description: params[:stripeEmail]
      )

      if charge.paid
        Order.create(
          product_id: @product.id,
          user_id: @user.id,
          total: @product.price
        )
        #flash[:success] = "You have successfully paid for your order!"
        UserMailer.order_confirmation_email(@user, @product).deliver_now
    end

    rescue Stripe::CardError => e
      # The card has been declined
      body = e.json_body
      err = body[:error]
      flash[:error] = "Unfortunately, there was an error processing your payment: #{err[:message]}"
    end
    redirect_to product_path(@product), notice: "Thank you for your purchase."
  end
end

这是控制台消息:

Started POST "/payments/create" for 127.0.0.1 at 2018-12-10 10:49:15 -0500
Processing by PaymentsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"jJhGPS9Su0IuepHt2Eea/hCEhDo3A3fggu6EUjwLDrJphrC8VmNRycUqzyLGiJpcaN3mHOzr224BYsbgbjo38Q==", "stripeToken"=>"tok_1Dfr0PHrTxlTJx3aoOtOh2Z9", "stripeTokenType"=>"card", "stripeEmail"=>"myemail@gmail.com"}
Completed 404 Not Found in 2ms (ActiveRecord: 0.0ms)

routes.rb

Rails.application.routes.draw do
  devise_for :users, path: '', path_names: { sign_in: 'login', sign_out: 'logout' }
  resources :users
  resources :products, :invoices, :orders, :users # 5.1 added ", :invoices, :orders, :users"
  resources :users, except: [:index]
  get 'simple_pages/about'
  get 'simple_pages/contact'
  get 'simple_pages/index'
  get 'simple_pages/landing_page'
  post 'simple_pages/thank_you'
  post 'payments/create'
  root 'simple_pages#landing_page'
  mount ActionCable.server => '/cable'


  resources :products do # 5.8 added
    resources :comments
  end

  resources :products do
     resources :payments
  end

  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

payments/_form.html.erb

<%= form_for [@product, @payment] do |f| %>

【问题讨论】:

  • 请将您的控制台输出添加到您的问题中。具体来说,params[:product_id] 的值是多少? (请编辑您的问题,不要在 cmets 中回复代码。)
  • 您能告诉我如何将该值输出到 Rails 控制台吗?
  • 在您的 rails 控制台(运行您的 rails 服务器的地方)中,您应该会看到一个以 Started POST 开头的事务。它应该包括以Parameters: 开头的行。只需将整个内容粘贴到您的问题中即可。
  • 谢谢。我已经添加了读数

标签: ruby-on-rails ruby ruby-on-rails-5 stripe-payments


【解决方案1】:

您没有在参数中传递产品 ID :product_id。理想情况下,这是一个路由问题。

对于为产品创建付款的请求,URL 的结构应为POST /products/:product_id/payments。这样,您就不必在表单中明确提及 product_id 作为隐藏字段,以便在请求中将其作为参数传递。

以下是在您的情况下生成嵌套路由的示例。

resources :products do
   resources :payments
end

详细说明为使其正常工作必须进行的更改:

在routes.rb 删除 resources :payments 和 resources :products。这两行将被替换为

resources :products do
   resources :payments
end

在app/controllers/payments_controller.rb

def new
  @product = Product.find(params[:product_id])  
  @payment = @product.payments.new
end

在app/views/payments/_form.html.erb

<%= form_for [@product, @payment] do |f| %>

假设您有一个 ID=1 的产品,要为该产品添加付款,您可以通过 URL 访问其付款表单 /products/1/payments/new.

【讨论】:

  • 感谢您的回复。我仍然不确定如何编辑我拥有的代码。我对此很陌生,但想弄清楚。
  • stackoverflow.com/questions/2034700/… 已经很好地解释了具有嵌套资源的表单的实现,并举了一个例子。
  • 我已通读该代码并将您的示例添加到我的路线中,但我真的不知道还能做些什么来使其正常工作。抱歉,我对此非常缺乏经验,只想让它工作。
  • 能否分享您在更改代码后遇到的错误并分享您的routes.rb 文件?并且不用担心没有经验,我们都从第一步开始。
  • 谢谢,标题还是一样的错误:ActiveRecord::RecordNotFound in PaymentsController#create,突出显示@product行。需要说明的是,我没有在 Payments Controller 中编辑任何内容(我真的不确定要编辑什么)
【解决方案2】:

如果您查看控制台日志,params[:product_id] 在请求中不存在

Parameters: {"utf8"=>"✓", "authenticity_token"=>"jJhGPS9Su0IuepHt2Eea/hCEhDo3A3fggu6EUjwLDrJphrC8VmNRycUqzyLGiJpcaN3mHOzr224BYsbgbjo38Q==", "stripeToken"=>"tok_1Dfr0PHrTxlTJx3aoOtOh2Z9", "stripeTokenType"=>"card", "stripeEmail"=>"myemail@gmail.com"}

那是你的问题。更改您在参数上发送 product_id 的请求,以便您的监视工作。

【讨论】:

  • 谢谢。我不确定如何更改在参数上发送 product_id 的请求。我可以编辑@product = 行吗?
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 2017-01-29
  • 2011-09-07
相关资源
最近更新 更多