2016-05-13 13 views
1

私はRailsアプリケーションにStripeを統合しようとしています。私は彼らのウェブサイトでチュートリアルを守り、そのほとんどを働かせました。私の1つの質問は、顧客に請求される価格を動的に変更する方法です。RailsでStripeの料金を動的に変更する方法はありますか?

@amountは500でハードコードされています。@price(new.html.erbまたはコントローラから)を '作成'アクションに渡すにはどうすればよいですか?

def new 
    @project = Project.find(params[:project_id]) 
    number_of_testers = @project.testers 
    @price = 30 * number_of_testers 
end 

def create 
    # Amount in cents 
    # @amount = 500 



    customer = Stripe::Customer.create(
    :email => params[:stripeEmail], 
    :source => 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 new_charge_path 
end 

あなたは非表示のフォームフィールドを追加することにより、paramsハッシュを経由して@price合格するか、またはあなたがコントローラに新しいアクションでそれを計算してから保存することができますnew.html.erb

<center> 
    <%= form_tag charges_path do %> 

     <article> 
     <% if flash[:error].present? %> 
      <div id="error_explanation"> 
      <p><%= flash[:error] %></p> 
      </div> 
     <% end %> 
     <label class="amount"> 
      <span>Amount: $<%= @price %></span> 
     </label> 
     </article> 

     <script src="https://checkout.stripe.com/checkout.js" class="stripe-button" 
      data-key="<%= Rails.configuration.stripe[:publishable_key] %>" 
      data-description="Buy usability testing credits" 
      data-amount="<%= @price*100 %>" 
      data-locale="auto"></script> 
    <% end %> 

</center> 

答えて

1

それはセッションで。その後、セッションからその値にアクセスします。たとえば、次のように

def new 
    @price = 30 * number_of_testers 
    session[:price] = @price 
end 

def create 
    @amount = session[:price] 
    ...rest of your code here... 
    session.delete(:price) 
end 

あなたが代わりのセッションを使用しての隠しフォームフィールドのルートを行けばあなたは自分のコントローラ内の隠しフィールドの属性をホワイトリストに登録する必要があり、それは他のフォームフィールドを持つparamsハッシュの一部として渡されます値。

2

なぜnumber_field_tag :amountを使用して、額をコントローラに送り返すcreate paramsの方法ですか?

しかし、以下のjsスクリプトから実際にストライプに合計を送る必要があると思われます。つまり、価格がフォームに変更された場合、jsで送信された値をリロードする必要があります。あなたの番号フィールドにはonChangeプロパティが必要です。新しい値を取得してストライプに送信するjs関数を呼び出します。

関連する問題