Javascript 仅允许在某些模型参数上进行条带购买

Javascript 仅允许在某些模型参数上进行条带购买,javascript,ruby-on-rails,ruby,stripe-payments,Javascript,Ruby On Rails,Ruby,Stripe Payments,Rails新手,正在使用Stripe的API。我的rails应用程序中有一个名为pieces的模型。每个片段都有一个称为status的整数。我只希望人们能够购买的作品,如果作品的状态为1。在我当前的代码中,我隐藏了购买按钮,除非状态为1。这在大多数情况下都有效,但是,如果两个人同时观看作品,那么他们都可以购买。这是因为在重新加载页面之前,其他页面上工件的状态不会更新 我的要求:我想在有人购买之前,找到一种方法来检查这件作品的状态是否为1。如果它不是1,我希望有一个rails的闪光消息说,这件作品

Rails新手,正在使用Stripe的API。我的rails应用程序中有一个名为pieces的模型。每个片段都有一个称为status的整数。我只希望人们能够购买的作品,如果作品的状态为1。在我当前的代码中,我隐藏了购买按钮,除非状态为1。这在大多数情况下都有效,但是,如果两个人同时观看作品,那么他们都可以购买。这是因为在重新加载页面之前,其他页面上工件的状态不会更新

我的要求:我想在有人购买之前,找到一种方法来检查这件作品的状态是否为1。如果它不是1,我希望有一个rails的闪光消息说,这件作品已经被购买。这将防止向用户收费,并防止创建
收费

这是我的收费管理员:

class ChargesController < ApplicationController
  def create

    piece = Piece.find(params[:piece_id])

    customer = Stripe::Customer.create(
      :email => params[:stripeEmail],
      :source  => params[:stripeToken]
    )

    charge = Stripe::Charge.create(
      :customer    => customer.id,
      :amount      => piece.total_price_in_cents,
      :description => piece.title,
      :currency    => 'usd'
    )

    purchase = Purchase.create(
        customer_email: params[:stripeEmail],

        total_transaction: piece.total_price,
        stripe_fee: piece.stripe_fee,
        taxes: piece.taxes,
        artist_cut: piece.artist_cut,
        charity_cut: piece.charity_cut,
        our_cut: piece.our_cut,

        currency: charge.currency,
        card: params[:stripeToken],
        description: charge.description, 
        customer_id: customer.id,
        piece_id: piece.id, 

        customer_name: params[:stripeShippingName],
        customer_address_line_1: params[:stripeShippingAddressLine1],
        customer_city: params[:stripeShippingAddressCity],
        customer_state: params[:stripeShippingAddressState],
        customer_zip_code: params[:stripeShippingAddressZip],
        customer_country: params[:stripeShippingAddressCountry],

        seller_name: piece.user.name,
        seller_email: piece.user.email,
        seller_address_line_1: piece.user.address_line_1,
        seller_address_line_2: piece.user.address_line_2,
        seller_city: piece.user.city,
        seller_state: piece.user.state,
        seller_zip_code: piece.user.zip_code

    )

    purchase.ship_by = purchase.created_at + 7.days
    purchase.arrive_by = purchase.created_at + 21.days
    purchase.save!

    piece.status = 3
    piece.save!
    redirect_to pieces_path, notice: "Thanks for buying #{piece.title} for $#{'%.2f' % piece.total_price}. You should get an email shortly."

    rescue Stripe::CardError => e
      flash[:error] = e.message
      redirect_to new_charge_path
    end

  end
class ChargesControllerparams[:stripeEmail],
:source=>params[:stripeToken]
)
charge=Stripe::charge.create(
:customer=>customer.id,
:金额=>件。总价(单位:美分),
:description=>piece.title,
:货币=>“美元”
)
purchase=purchase.create(
客户电子邮件:params[:stripeEmail],
交易总额:件。总价,
条纹费:件。条纹费,
税:计件税,
艺术家切:件,艺术家切,
慈善切:一块,慈善切,
我们的切:一块,我们的切,
货币:charge.currency,
卡片:params[:stripeToken],
描述:charge.description,
customer\u id:customer.id,
件号:件号,
客户名称:参数[:stripeShippingName],
客户地址行1:params[:stripeShippingAddressLine1],
客户城市:参数[:stripeShippingAddressCity],
客户状态:参数[:stripeShippingAddressState],
客户邮政编码:params[:stripeShippingAddressZip],
客户所在国家/地区:参数[:stripeShippingAddressCountry],
卖方名称:piece.user.name,
卖方电子邮件:piece.user.email,
卖方地址行1:piece.user.address行1,
卖方地址行2:piece.user.address行2,
卖方城市:piece.user.city,
卖方状态:piece.user.state,
卖家邮编:piece.user.zip
)
purchase.ship_by=purchase.created_时间+7.5天
purchase.arrival\u by=purchase.created\u时间+21.5天
购买,保存!
工件状态=3
救命!
将_重定向到pieces_路径,注意:“感谢您以$#{%.2f'%piece.total_price}购买#{piece.title}。您应该很快就会收到电子邮件。”
救援条带::CardError=>e
闪光[:错误]=e.message
重定向到新的充电路径
结束
结束
这是我的作品展示页面,上面有stripe buy按钮:

<div class="container">  
  <div class="row">
   <div class="col-md-offset-2 col-md-8">
    <div class="panel panel-default">
     <div class="panel-body">

      <!-- Stripe Form -->
      <% if current_user != @piece.user && @piece.status == 1 %>
         <%= form_tag charges_path, id: 'chargeForm' do %>
              <script src="https://checkout.stripe.com/checkout.js"></script>
              <%= hidden_field_tag 'stripeToken' %>
              <%= hidden_field_tag 'stripeEmail' %>


              <button id="btn-buy-show" type="button" class="btn btn-success btn-lg btn-block">Buy for $<%= number_with_precision(@piece.total_price, :precision => 2, :delimiter => ',')%></button>
              <script>
              var handler = StripeCheckout.configure({
                key: '<%= Rails.configuration.stripe[:publishable_key] %>',
                shippingAddress: true,
                token: function(token, arg) {
                  document.getElementById("stripeToken").value = token.id;
                  document.getElementById("stripeEmail").value = token.email;
                  document.getElementById("chargeForm").submit();
                }
              });
               document.getElementById('btn-buy-show').addEventListener('click', function(e) {
                handler.open({
                  name: 'Metallic Palette',
                  description: '<%= @piece.title %> ($<%= number_with_precision(@piece.total_price, :precision => 2, :delimiter => ',')%>)',
                  amount: document.getElementById("amount").value
              });
              e.preventDefault();
             })
            </script>
          <% end %>
      <% end %>

      <% if @piece.status == 3 %>
        <p>This piece has already been bought.
          <% if current_user == @piece.user || admin_user_signed_in? %>
            <%= render 'pieces/purchase_details' %>
          <% end %>
        </p>
      <% end %>
    </div>
  </div>
</div>

以2美元购买,:delimiter=>,)%>
var handler=StripeCheckout.configure({
键:“”,
发货地址:对,
令牌:函数(令牌,arg){
document.getElementById(“stripeToken”).value=token.id;
document.getElementById(“stripeEmail”).value=token.email;
document.getElementById(“chargeForm”).submit();
}
});
document.getElementById('btn-buy-show')。addEventListener('click',函数(e){
handler.open({
名称:“金属调色板”,
说明:“($2,:分隔符=>”,“)%>)”,
金额:document.getElementById(“金额”).value
});
e、 预防默认值();
})
这件已经买了。


非常感谢你们。

你们只需要检查一下:)

但是,很少有人建议您: 1) 不要在代码中使用数字。使常量(如
Piece::AVAILABLE
)和方法(
Piece.AVAILABLE?
)或使用
enum
)。如果你只使用你的数字,你将来会有很多问题

2) 提取表单对象-您不希望控制器中有这么大的方法。如果您将其提取到单独的服务中,它将更易于测试、预测和更新

3) 提取
工件。在筛选之前查找
并将工件状态检入

def create
  piece = Piece.find(params[:piece_id])

  if piece.status != 1
    flash[:error] = 'Piece is not available :('
    return redirect_to peaces_path # or whatever
  end

  ...
end