不确定在哪里放置Stripe API调用

时间:2015-09-07 21:17:45

标签: ruby-on-rails stripe-payments

现在几个小时都在考虑这个问题,我认为这是因为我误解了一些基本的铁轨知识

this intro Stripe guide中,他们演示了以下代码

def new
end

def create
  # Amount in cents
  @amount = 500

  customer = Stripe::Customer.create(
    :email => 'example@stripe.com',
    :card  => params[:stripeToken]
  )

  charge = Stripe::Charge.create(
    :customer    => customer.id,
    :amount      => @amount,
    :description => 'Rails Stripe customer',
    :currency    => 'usd'
  )

rescue Stripe::CardError => e
  flash[:error] = e.message
  redirect_to charges_path
end

我的问题是,create操作中的所有代码都必须位于create内吗?

我正在尝试按照指南进行操作,但我只有一个产品,而不是只有一个产品。所以我很自然地把代码放在show动作中。

class BooksController < ApplicationController

    def index
        @books = Book.all
    end

    def show
        @book = Book.find(params[:id])


        customer = Stripe::Customer.create(
            :email => 'example@stripe.com',
            :card  => params[:stripeToken]
        )

        charge = Stripe::Charge.create(
            :customer    => customer.id,
            :amount      => @book.price,
            :description => 'Rails Stripe customer',
            :currency    => 'usd'
        )

        rescue Stripe::CardError => e
            flash[:error] = e.message
            redirect_to books_path

    end
end

现在,每当我尝试访问任何显示页面(localhost:3000 / books / 1)时,它都会重定向到books_path,这会告诉我存在某种CardError。

这里发生了什么?

2 个答案:

答案 0 :(得分:2)

是的,你混淆/混合一些铁路知识。你需要做的是:

#Create your BooksController
class BooksController < ApplicationController
  def index
    @book = Book.all
  end

  def new
    @book = Book.new
  end 

  def create
    @book = Book.new(book_params)
      if @book.save
        #do something
      else
        #do something
      end
  end

  def show
    @book = Book.find(params[:id])
  end

   #edit
   #destroy    
end

然后,单独地,您将创建条带事务;这可能位于名为Sales的控制器中。

#Create your SalesController
class SalesController < ApplicationController


  def create
    @book = Book.find(params[:book_id])
      #stripe create code using book attributes (@book.price)



   #after sale in stripe. create record in a sales table.

   Sale.create(book_id: @book.id, amount: @book.price, other stuff)

  end

end

您需要在路线文件中将您的sales操作嵌套在图书操作中。

resources: books do 
  resources :sales
end

这应该让你开始朝着正确的方向前进。

答案 1 :(得分:1)

因为您的fetchRequest.fetchLimit = 20 方法中包含此内容:

show

当您尝试通过 rescue Stripe::CardError => e flash[:error] = e.message redirect_to books_path 操作访问任何网页时,它会尝试创建show并收到错误,以便上述代码获救并重定向到{ {1}}。所以,这是非常正常的行为。

如果您修复了您获得的charge,则会成功收费。但是,再次,这不是创建指控的正确位置。 您应该有一个自定义控制器/视图,如教程本身所示,以创建费用。

在您的展示页面中,您可以拥有产品表单和购买产品的按钮,当按下该按钮时,您的表单应该提交给您创建费用的自定义控制器的操作方法。