2016-05-13 20 views
0

私はボート用の広告/広告を作成できる既存のRailsアプリケーションを使用しています。現在、支払いは一切統合されておらず、ユーザーがフォームを提出すると、それが掲示されます。今、私はSpripe Checkoutを追加することを検討しています(私が間違っている場合は、私が正しいと思われるので、正しいと思います)。私はこれに接近する最善の方法が何であるか分かりません。理想的には、ユーザーがフォームを送信してから支払いを求められるようにしたいと思います。Stripe CheckoutとRailsアプリケーションの統合

また、私はどのようなアプローチをとるべきかわからない:1)データベースで広告が最初に作成された後、支払いでブール値(たとえば "支払い")の値が変更されるか、2)広告のデータベース成功した支払いでのみレコードが作成されます。

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

adsコントローラにビルドするよりも別のコントローラを作成する方が、より多くの費用がかかります。あなたは間違いなく 'トランザクション'として知られているものにdbプロセス全体をラップして、成功した支払いだけを追加することを保存する必要があります。 'トランザクション'プロセス中に障害が発生した場合、データベースをロールバックして適合性を維持します。

jstripeチュートリアルは非常に深さにあるが、あなたはより多くの情報と具体的な例を探しているなら、私はあなたに実行することが落とし穴と落とし穴の多くの周りに私を歩いた私は、このテーマに買った素晴らしい本読み: をhttps://www.masteringmodernpayments.com/

+1

ありがとう、とても助かりました!私はあなたが提案したものを正確にやり遂げました - 支払いのための別のコントローラを作成しました。私はユーザーが最初に広告を作成して(dbで保存する)、次のページで支払いを求めることができます。すぐに支払われないと、広告は一定期間データベースに残ります(しかし、リストには表示されません)。その後、広告は削除されます。ユーザーは支払いを含むすべての広告を管理でき、いつでも支払いを受けることができます。おそらくあなたが頭に入れていた "トランザクション"プロセスのようなものではありませんが、現在のこのアプリではうまく機能します。 – Bella

関連する問題