【问题标题】:refresh Drop-in UI after error - Braintree/Rails错误后刷新 Drop-in UI - Braintree/Rails
【发布时间】:2016-02-04 09:53:32
【问题描述】:

我正在使用 Braintree api 及其在 UI 中的 Drop,它工作正常,直到我得到不成功的响应。

ui 中的下降没有刷新(也许我需要做一些事情),这导致用户无法输入新卡的详细信息。我不想保留卡的详细信息,只需再次显示表单即可

我没有使用 turbolinks

def new
  gon.client_token = generate_client_token
end

def create
  @result = Braintree::Transaction.sale(
            amount: amount,
            payment_method_nonce: params[:payment_method_nonce],
            customer: {
              first_name: params[:first_name],
              last_name: params[:last_name]
            options: {
              submit_for_settlement: true
            }
          )
  if @result.success?
    redirect_to thank_you_path
  else
    @error_message = BraintreeErrors::Errors.new.error_message(@result)
    flash.now[:alert] = @error_message
    gon.client_token = generate_client_token
    render :new
  end
end

我需要做些什么才能让它工作吗?

更新

与在 cmets 中一样,我可以重定向到新操作,重新加载我的页面,然后以 ui 表单显示我的下拉列表,所以为了扩展这个问题,如果我想保留用户填写的数据怎么办我表格的另一部分,比如姓名、地址等,我也不担心卡信息

我使用 form_tag

<%= form_tag transactions_path, class: 'form-small form' do %>
  <%= text_field_tag :first_name, "", placeholder: 'First Name', required: false %>
  <%= text_field_tag :last_name, "", placeholder: 'First Name', required: false %>
<% end %>

谢谢

【问题讨论】:

  • 您是否考虑过重定向到新操作而不是呈现它的模板?
  • @Mihai-AndreiDinculescu 我已经更新了我的问题,在这种情况下如何保存表单数据?
  • 您可以简单地将其作为实例变量传递,就像使用 client_token 一样。
  • 谢谢,这在使用 form_tag 时可行吗?如果你能提供一个例子?非常感谢并帮助我理解,我可以使用 params[:first_name] 获取单个参数,但我需要获取整个表单,真的不是吗?
  • 想想我可以通过@result 对象(如@result.transaction.customer_details)访问它们。只是如何让他们现在填充表单

标签: ruby-on-rails ruby ruby-on-rails-4 braintree


【解决方案1】:

您可以使用create 操作redirect_to new 操作。

def new
  @first_name = params[:first_name] if params[:first_name].present?
  @last_name = params[:last_name] if params[:last_name].present?
end

def create
  ...

  if @result.success?
    redirect_to thank_you_path
  else
    redirect_to new_path (
      first_name: params[:first_name], 
      last_name: params[:last_name]
    )
  end
end

然后您需要更新表单,以便它选择“默认”值

<%= form_tag transactions_path, class: 'form-small form' do %>
  <%= text_field_tag :first_name, @first_name, placeholder: 'First Name', required: false %>
  <%= text_field_tag :last_name, @last_name, placeholder: 'First Name', required: false %>
<% end %>

如果您有许多这样的属性,将它们全部捆绑在一个customer_details 对象中会更简洁。那么在你看来你可以这样做

<%= form_for @customer_details do |c| %>
  <%= c.text_field :first_name %>
<% end %>

【讨论】:

  • 谢谢,所以最初是 form_tag,但在错误切换到带有新对象的 form_for 之后?
  • 不,两种情况下的视图应该相同。我刚刚向您展示了两种不同的方法。一个带有简单的实例变量和form_tag,另一个带有一个捆绑内部属性的对象和form_for
  • 啊,好吧,我明白了,如果我在声明 @first_name 之后重定向,那在新操作中不会只是零吗?还是我误会了?
  • 我应该将此信息保存在会话变量中吗?
  • 您应该尽可能避免使用会话。
猜你喜欢
  • 2020-05-23
  • 2019-11-05
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 2014-09-28
  • 1970-01-01
  • 2015-05-10
相关资源
最近更新 更多