【问题标题】:Integrate Stripe Checkout with Rails app将 Stripe Checkout 与 Rails 应用程序集成
【发布时间】:2016-05-13 01:43:15
【问题描述】:

我有一个现有的 Rails 应用程序,用户可以在其中为船只创建分类/广告。目前没有集成支付,一旦用户提交表单,它就会被发布。现在,我希望将 Spripe Checkout(因为这似乎是最简单的,如果我错了,请纠正我)添加到我的应用程序中。我不确定解决此问题的最佳方法是什么。理想情况下,我希望用户提交表单,然后被要求付款。

另外,我不确定我应该采用哪种方法:1) 首先在数据库中创建广告,然后在付款时更改布尔列值(例如“付款”)或 2) 广告的数据库记录仅在成功付款后创建。

我应该像 Stripe 教程建议的那样创建一个新的 Charges 控制器还是将其合并到我现有的 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>

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

【问题讨论】:

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


    【解决方案1】:

    创建一个单独的控制器比将它构建到广告控制器中更容易。您绝对应该将整个数据库流程包装在所谓的“交易”中,并希望仅在成功付款时保存添加。如果任何部分在整个“事务”过程中出现故障,它将回滚您的数据库并保持一致性。

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

    【讨论】:

    • 谢谢,这很有帮助!我最终完全按照您的建议做了 - 创建了一个单独的付款控制器。我允许用户先创建广告(保存在数据库中),然后在下一页要求付款。如果不立即付款,广告将在数据库中保留(但不会列出)一段时间,之后将被删除。用户可以管理他们的所有广告,包括付款,并且可以选择随时付款。这可能不是您想到的那种“交易”过程,但对于当前的应用程序来说,它运行得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2019-04-14
    • 2021-02-03
    • 2020-12-27
    相关资源
    最近更新 更多