我有一个现有的Rails应用程序,用户可以在其中为船只创建分类广告/广告。目前没有集成付款,一旦用户提交表单,就会发布。现在我想在我的应用程序中添加Spripe Checkout(因为它似乎是最简单的,如果我错了,请更正确)。我不确定最好的方法是什么。理想情况下,我希望用户提交表单然后被要求付款。
另外,我不确定应采取哪种方法:1)首先在数据库中创建广告,然后在付款时更改布尔列值(例如“付款”)或2)广告的数据库记录只有成功付款才能创建。
我应该创建一个新的Charges控制器,如Stripe教程建议或将其合并到我现有的AdsController中吗?
ads_controller.rb
class AdsController < ApplicationController
before_action :logged_in_user, only: [:edit, :update, :new]
before_action :correct_user, only: [:edit, :update, :destroy]
def index
if params[:category].blank? && params[:state].blank?
@ads = Ad.all.order("created_at DESC")
elsif params[:category].blank?
@state_id = State.find_by(name: params[:state]).id
@ads = Ad.where(state_id: @state_id).order("created_at DESC")
else
@category_id = Category.find_by(name: params[:category]).id
@ads = Ad.where(category_id: @category_id).order("created_at DESC")
end
@ads = @ads.paginate(page: params[:page], :per_page => 21)
end
def new
@ad = Ad.new
end
def create
@ad = current_user.ads.build(ad_params)
if @ad.save
flash[:success] = "Ad successfully created"
redirect_to @ad
else
render 'new'
end
end
def show
@ad = Ad.find(params[:id])
end
def edit
@ad = Ad.find(params[:id])
end
def update
@ad = Ad.find(params[:id])
if @ad.update_attributes(ad_params)
flash[:success] = "Ad successfully updated"
redirect_to @ad
else
render 'edit'
end
end
def destroy
@ad.destroy
flash[:success] = "Ad deleted"
redirect_to request.referrer || root_url
end
private
def ad_params
params.require(:ad).permit(:title, :price, :year, :location, :description, :contact_name, :contact_number, :category_id, :picture, :picture2, :picture3, :state_id)
end
def correct_user
@ad = current_user.ads.find_by(id: params[:id])
redirect_to root_url if @ad.nil?
end
def logged_in_user
unless logged_in?
flash[:danger] = "Please log in"
redirect_to login_path
end
end
我当前的表格:
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_for(@ad, html: { multipart: true }) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.label "Category:" %>
<%= f.collection_select :category_id, Category.all, :id, :name, { prompt: "Select Category" }, class: 'form-control' %>
# Lots of other form fields
<%= f.submit "Submit", class: "btn btn-primary" %>
<% end %>
</div>
对此的任何想法都将受到高度赞赏。
答案 0 :(得分:0)
创建单独的控制器而不是将其构建到广告控制器中会更具铁索性。您绝对应该将整个数据库进程包装在所谓的“事务”中。并期待仅在成功付款时保存添加。如果任何部分在整个交易过程中失败了。进程它将回滚您的数据库并保持一致性。
jstripe教程非常深入,但如果您正在寻找更多信息和具体示例,我会阅读一本关于这个主题的精彩书籍,它让我了解了很多陷阱和陷阱,您可能会遇到: https://www.masteringmodernpayments.com/