2016-04-29 23 views
0

我已成立布倫特裏支付與託管領域如下:布倫特裏託管領域新增CC

在JS文件:試圖建立新的客戶時

braintree.setup(client_token, "custom", { 
     id: "my-sample-form", 
     paypal: { 
      container: "paypal-container" 
     }, 
     hostedFields: { 
      number: { 
      selector: '#my-credit-card-field', 
      }, 
      cvv: { 
      selector: '#my-security-code-field', 
      }, 
      expirationDate: { 
      selector: '#my-expiration-field', 
      }, 
      postalCode: { 
      selector: '#my-postal-code-field', 
      } 
     }, 
     }); 

我沒有問題,當他們需要以填補他們的CC細節,但是,當我嘗試建立現有客戶,JS文件失敗,原因是不存在的#my-credit-card-field等。

在我new.html.erb,我有這樣的事情:

<% unless current_user.has_payment_info? %> 
    <div id="my-credit-card" readonly>**** **** **** <%= @last_4_number %></div> 
<% else %> 
    <div id="my-credit-card-field"></div> 
    <div id="my-security-code-field"></div> 
    <div id="my-expiration-field"></div> 
    <div id="my-postal-code-field"></div> 
<% end %> 

因此,我會詢問cc客戶的詳細信息,現有客戶可以保存他們的付款方式信息。我在我的控制器是這樣的:

def create 
    @amount = params[:slider] 
    @token = Braintree::Customer.find(current_user.braintree_customer_id).credit_cards.first.token 
    unless current_user.has_payment_info?  
    @result = Braintree::Transaction.sale(
      amount: @amount, 
      payment_method_nonce: params[:payment_method_nonce], 
      options: { 
       store_in_vault: true 
        }) 
    else 
    @result = Braintree::Transaction.sale(
      customer_id: current_user.braintree_customer_id, 
      amount: @amount, 
      payment_method_token: @token) 
    end 

if @result.success? 
#Some codes here 
end 
end 

我的問題:

如果我把我的ID來my-credit-card-field對現有客戶的形式,那麼他們將需要填寫的細節,由於hostedfields選擇JS。如果我沒有設置任何選擇器,那麼JS文件中存在錯誤。那麼是否有更好的方式爲已經設置付款方式的現有客戶創建表格?

感謝和任何幫助,將不勝感激!

回答

1

那麼,你可以做兩件事之一。

選項1:簡單的黑客攻擊。

因爲當你不需要布倫特裏的div添加到一個地方你的網頁上表單之外像時代:現在

<div style="display:none" id="my-credit-card-field"></div> 
<div style="display:none" id="my-security-code-field"></div> 
<div style="display:none" id="my-expiration-field"></div> 
<div style="display:none" id="my-postal-code-field"></div> 

,在頁面加載,布倫特裏會發現它們,並填充它們,但沒有提交。

當然,當你需要它的時候,不要將這些隱藏的div添加到頁面中(因爲它們已經在表單中)。

選項2(推薦):使用偏色。

在你不需要Braintree的情況下,真的不需要甚至調用javascript,對吧?所以,您可以將您的JavaScript移動到只在必要時才添加到頁面的部分。這樣,Braintree在這種情況下甚至不會嘗試調用填充div,所以沒有錯誤。只需在您的條件塊中包含渲染調用即可。

儘管選項1的確速度更快,但我會推薦選項2,因爲它可能是「正確」的方法,當您忘記黑客時,您將避免「爲什麼我們有他隱藏的div」問題。

+0

謝謝,最後一件事 - 如何使用JavaScript的partials? – pyfl88

+0

坦率地說,有很多方法,但對於這個簡單的東西,我會有一個只包含javascript的局部視圖(是的,存儲在app/views目錄中)。在該視圖中,您可以使用'javascript_tag'來執行此操作(http://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html#method-i-javascript_tag)。還有其他方法,比如在你的視圖中使用'content_for'或者使用替代佈局,但可能矯枉過正(除非你特別需要頭標籤中的JS(可疑),那麼你就需要'content_for')。 – GoGoCarl