如何在不使用表单的情况下从 Rails 应用程序发布到外部 url

Posted

技术标签:

【中文标题】如何在不使用表单的情况下从 Rails 应用程序发布到外部 url【英文标题】:How to post to external url from rails app without using form 【发布时间】:2015-07-01 05:25:28 【问题描述】:

我可以使用 html 表单发布到我的支付网关。但是我有一个新的要求。现在,单击“付款”按钮后,我必须验证项目是否仍可购买,如果可用,则自动将付款表格发布到网关。

也就是说,我想在单击按钮时执行一些 Rails 控制器代码,然后如果验证成功,则希望使用参数重定向到外部 URL(支付网关)。

我读到了,在 rails 中使用 redirect_to 是不可能的。也不能使用 ajax 发布到外部 url。我应该如何实现它?

【问题讨论】:

我就是这样处理的。在结帐页面上 - 我没有生成付款表格,而是生成了一个指向“付款”操作的链接,其中包含远程:true。然后我验证了所有关于“付款”操作的检查。验证失败时重定向到主页,支付成功时渲染payment.js.erb。为付款表单编写了新的部分“_payment_form.html.erb”。现在在 payment.js.erb 中,我即时渲染 payment_form 并将其添加到一些 div 并使用 jquery 提交表单。 【参考方案1】:

你可以像这样使用 Ruby 的Net::HTTP:

require "net/http"
require "uri"

uri = URI.parse("http://example.com/search")
params = "foo" => "value one", "bar" => "value two"


# Shortcut way
response = Net::HTTP.post_form(uri, params)


# With more control
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_uri)
request.set_form_data(params)
response = http.request(request)


puts response.code             # => 200
puts response.body             # => The body (HTML, JSON, etc)

【讨论】:

实际上,我想在成功验证后重定向到我的支付网关。我通过使用ajax发布(远程:true)然后对控制器的操作(支付)进行所需的验证并呈现payment.js.erb然后在payment.js.erb中呈现一个表单并使用jquery将其提交给支付网关。 感谢您的回答。它帮助我完成了我想要在应用程序本身中捕获响应的退款 API 调用。

以上是关于如何在不使用表单的情况下从 Rails 应用程序发布到外部 url的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用自动模型表单的情况下从 Django 的文本框中获取数据?

如何在不提交 HTML 表单的情况下从数据库中获取数据? [复制]

如何在不通过视图在所有页面中发送表单的情况下从 django 布局(如“base.html”)获取表单数据?

Rails - 如何在不更改页面和更新视图的情况下提交表单?

在 Rails 4 中,如何在不刷新的情况下在页面上提交表单和更新元素

如何在不注册身份的情况下从外部提供商获取用户登录信息