我正在尝试通过HTTP#post_form
从外部Ruby脚本向Rails应用发送POST请求。请求是create
操作(即URI为http://server/controller
)。
如果我将一个参数编码到请求中,一切都很好:
HTTP::post_form(uri, { :my_param => "value" })
虽然我必须在控制器中手动从my_param
明确提取params
。这似乎效率低下,并打破了从应用程序本身创建新记录(因为该参数不存在)。因此,我试图使我的脚本姿势为Rails本身,传递适当的数据,如控制器所期望的那样,例如。
HTTP::post_form(uri, { :object => { :my_param => "value" } })
然而,这不起作用。 post_form
似乎正在将我的哈希转移到不同的东西,即
{ "object" => [\"my_param\", \"value\"] }
这显然不会做同样的事情。我错过了传递数据的方式吗?或者我可以达不到我想要的东西(从应用程序外部创建新记录)?
答案 0 :(得分:1)
一种简单的方法可能是简单地模仿Rails如何格式化其参数,如下所示:
params = { :my_param => "value", ... }
params = Hash[params.map { |key,value| ["object[#{key}]",value] } ]
HTTP::post_form(uri, params)
编辑:好吧,看看那个,我看了一下,发现Rails实际上为你提供了一种使用自己的机制做同样事情的方法:
require 'active_support/core_ext'
...
HTTP::post(uri, parameters.to_param)
to_param
方法将正确处理数组,以及其他所有方法。请注意,在这种情况下,您要使用HTTP::post
,而不是post_form
,因为参数已经转换为字符串。
答案 1 :(得分:1)
我对post_form了解不多,但对我来说自然的解决方案是使用ActiveResource对象。
ActiveResource可用于ruby以及Rails。你就像使用模型一样只使用它发布并使用XML 关于这是如何工作的Railscast
http://railscasts.com/episodes/94-activeresource-basics
http://railscasts.com/episodes/95-more-on-activeresource
我认为你会发现这比post_form更适合你的要求,但正如我所说,我不熟悉post_form。