现在几个小时都在考虑这个问题,我认为这是因为我误解了一些基本的铁轨知识
在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。
这里发生了什么?
答案 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
,则会成功收费。但是,再次,这不是创建指控的正确位置。
您应该有一个自定义控制器/视图,如教程本身所示,以创建费用。
在您的展示页面中,您可以拥有产品表单和购买产品的按钮,当按下该按钮时,您的表单应该提交给您创建费用的自定义控制器的操作方法。