根据变量值提交表单的不同行动

时间:2015-07-25 09:56:41

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

我有一个结帐表单,其中包含一个输入优惠券代码的字段。目前,表单始终发布到付款商家。但是,如果由于优惠券代码而应付金额为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为零,我希望第二种形式不发布给商家,而是使用flash消息重定向到root_path。我怎样才能做到这一点?如何根据action的更新值(最好使用Ruby而不是javascript)为第二个表单变量设置@payment

1 个答案:

答案 0 :(得分:0)

据我所知,您不希望使用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中,您可以检查更新的金额是否为零,并相应地设置表单网址。

希望你发现这很有用。