【问题标题】:Different action on submit of form depending on a variable's value表单提交的不同操作取决于变量的值
【发布时间】:2015-07-25 09:56:40
【问题描述】:

我有一个结帐表格,其中包含一个用于输入优惠券代码的字段。目前,表单始终发布给支付商家。但是,如果由于优惠券代码的原因,应付金额为 0,我希望它采取不同的行动/路线。

查看页面包含:

# Form where to enter coupon code
<%= form_for @coupon, method: :post, url: {action: "check_coupon", :controller => 'coupons', format: 'js'}, remote: true do |f| %>
  <%= f.submit "Submit Coupon" %>
  <%= f.text_field :couponcode, :placeholder => "Enter coupon" %>
  ...hidden fields...
<% end %>

# Form sent to payment merchant
<form action="https://secure.***.com/order.html" method="post" >
  <input type="hidden" name="payment" value="<%=@payment%>" class='js-couponpayment' />
  ...other hidden fields...
</form>

控制器方法check_coupon 只是验证优惠券并设置一些在表单中作为隐藏字段存在的变量以发送给支付商家。这包括一个名为@payment 的变量,它指定要支付的金额。此金额会根据输入的优惠券进行更新。 Ajax 用于在屏幕上显示更新后的金额,但为了保证其安全check_coupon,而不是仅针对屏幕上显示的数字的脚本,设置要发送给商家的实际金额。

如果@payment 为零,我希望第二个表单不要发给商家,而是通过一条消息重定向到root_path。我怎样才能做到这一点?如何根据@payment 的更新值为第二个表单变量创建action(最好使用Ruby 而不是javascript)?

【问题讨论】:

  • 第二个表单有提交按钮吗?如果没有,第二个表单什么时候提交?
  • 是的,两个表单都有提交按钮。

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


【解决方案1】:

据我了解,您不想使用 Ajax 更新支付隐藏字段,因为您认为在服务器端呈现它会更安全。但是,AFAIK 并非如此,因为无论您在哪里呈现,如果您仍在显示表单并让用户提交表单,最终用户总是有可能摆弄隐藏的字段值。毕竟,无论你在哪里渲染,它总是以相同的 HTML 结尾。因此,必须通过其他措施来应对安全性,例如使用私钥制作 HMAC 真实性哈希。

考虑到安全性,纯粹的 ruby​​ 解决方案是根本不使用 ajax。而是让check_coupon 操作呈现一个全新的页面,该页面检查优惠券代码后的总和,如果总和 > 0 则再次呈现更新的付款表单,否则使用 flash 重定向到 root_url。

但上述解决方案需要重新加载整个页面并降低交互性(用户必须等待页面重新加载)。如果您不希望这样,您可以让您的 ajax 响应发回一个脚本,该脚本既可以更新付款表单,也可以更新用户看到的金额。请记住,使用 rails,您仍然可以使用 ruby​​ 在服务器端呈现支付表单。例如。 js 响应将是

$('#container-div-of-payment-form').html(<%= j render("payment_form_partial")%>);
//code to update the sum user sees here

在您的 payment_form_partial 中,您可以检查更新后的总和是否为零,并相应地设置表单网址。

希望你觉得这很有用。

【讨论】:

  • 谢谢,我希望我能完全理解:我使用 Ajax 只是为了在屏幕上显示总和。其他人为我编写了这个 Javascript;我还不能用 Javascript 编写代码,这也是我正在寻找 Ruby 解决方案的部分原因。所以 Ajax 仅用于视觉效果,而不是如何处理第二个表单的提交的任何部分。在控制器(而不是 Ajax)中计算金额,实际上还计算了一个哈希值,商家将根据要支付的金额检查该哈希值。所以我认为安全明智,它设置正确。
  • 是不是不能把第二个表单的url改成控制器方法,然后再决定是发给商家还是用flash消息重定向?这也是一个额外的步骤,但对于用户而言,它不会像页面重新加载那样体验。或者这是否意味着所有表单的隐藏字段都必须在控制器方法中重复,我想这会使它变得非常混乱......?
  • 遗憾的是,如果您不想重新加载整个页面,ajax 和 javascript 是实现所需行为的唯一方法。我建议您查找如何使用 rails 使用 ajax javascript 响应。这实际上很容易。您甚至可以在 js 响应中使用 erb。这是一个excellent tutorial,关于在 railscasts.com 上的 rails 中使用 ajax。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 2016-07-03
相关资源
最近更新 更多