使用Rails应用程序集成Stripe Checkout

时间:2016-05-13 01:43:15

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

我有一个现有的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>

对此的任何想法都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

创建单独的控制器而不是将其构建到广告控制器中会更具铁索性。您绝对应该将整个数据库进程包装在所谓的“事务”中。并期待仅在成功付款时保存添加。如果任何部分在整个交易过程中失败了。进程它将回滚您的数据库并保持一致性。

jstripe教程非常深入,但如果您正在寻找更多信息和具体示例,我会阅读一本关于这个主题的精彩书籍,它让我了解了很多陷阱和陷阱,您可能会遇到: https://www.masteringmodernpayments.com/