0

フローが次のようになる非常にシンプルなアプリがあります。

ユーザーはいくつかのコピーを読み、製品を購入してフォームに記入することを決定します。確認ページを参照してください。

コントローラに問題がありますが、エラーが発生している場所を正確に特定できませんCouldn't find Customer without an ID.

class CustomersController < ApplicationController
#  before_filter :load_customer, :only => :show

  def new
    @customer = Customer.new
  end

  def create
    @customer = Customer.new(params[:customer])

    if @customer.save
      session[:customer_id] = @customer.id
      purchase
    else
      flash[:error] = "Please enter a valid email address"
      redirect_to :signup
    end
  end

  def signup
    @customer = Customer.new
  end


  def purchase
    Stripe.api_key = STRIPE['secret']
    charge = Stripe::Charge.create(
    :amount => 2000,
    :currency => "usd",
    :card => params[:stripe_token],
    :description => "My Product Name"
    )
    redirect_to receipt_path
  end

  def receipt
    @customer = Customer.find(session[:customer_id])

    @name = @customer.name
    @email = @customer.email
    @product = @customer.product
  end

  # private
  # 
  # def load_customer
  #   @customer = Customer.find(session[:customer_id])
  #   redirect_to request.path.gsub(params[:id], session[:customer_id].to_s) if params[:id] != session[:customer_id].to_s
  # end

end

物事がどこで台無しになっているのかわかりません。グーグルを何度も繰り返した後、皆さんに目を向けます。ヘルプは巨大になるでしょう。

編集:

Railsコンソールを参照すると、私のアプリケーションが何らかの理由で新しい顧客レコードを作成していないことがわかります。ただし、充電は機能しています。作成されていない顧客は、これの前兆である必要があります。

編集2:Development.log

Started GET "/assets/bootstrap.js?body=1" for 127.0.0.1 at 2012-08-28 15:58:11 -0700
Served asset /bootstrap.js - 304 Not Modified (0ms)
[2012-08-28 15:58:11] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true


Started POST "/checkout" for 127.0.0.1 at 2012-08-28 15:58:12 -0700
Processing by CustomersController#purchase as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"k2aW/CAkNfwDSMHHvzbuOwm+Xua0qb2LJ4LtrtRvyvk=", "customer"=>{"name"=>"Your name", "email"=>"yourname@example.com"}, "stripe_token"=>"tok_0GUvwKPwo6jfEu"}
Redirected to http://localhost:3000/receipt
Completed 302 Found in 1064ms (ActiveRecord: 0.0ms)


Started GET "/receipt" for 127.0.0.1 at 2012-08-28 15:58:14 -0700
Processing by CustomersController#receipt as HTML
Completed 500 Internal Server Error in 0ms

ActiveRecord::RecordNotFound (Couldn't find Customer without an ID):
  app/controllers/customers_controller.rb:38:in `receipt'


  Rendered /Users/zack/.rvm/gems/ruby-1.9.3-p194@beat-the-herd/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/_trace.erb (3.9ms)
  Rendered /Users/zack/.rvm/gems/ruby-1.9.3-p194@beat-the-herd/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (5.6ms)
  Rendered /Users/zack/.rvm/gems/ruby-1.9.3-p194@beat-the-herd/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (23.7ms)
4

3 に答える 3

1

receiptユーザーがアクションに直接ルーティングする場合は、session[:customer_id]nilになる可能性があります。そのため、エラーが発生します。create(おそらく)POSTリクエストが発行された場合、これは発生しません。receiptこの場合、アクションへのリダイレクトの前にセッション変数が設定されています。

于 2012-08-28T22:59:57.577 に答える
0

この行:

@customer = Customer.find(session[:customer_id])

session [:customer_id]がnilであるため、エラーがスローされます

例外をスローしないがnilレコードを返すfind_by_idを使用することをお勧めします。

次に、@customerがnilの場合に対処する必要があります。

于 2012-08-28T22:51:35.807 に答える
0

これをUserControllerに追加します

def show <br>
@user = User.find(session[:user_id])<br>
@profile = @user.profile<br>
end

「user_id」を置くのではなく、セッションを置く[:user_id]
それは私のために働いた

于 2013-07-01T18:11:31.030 に答える