2011-08-04 60 views
1

我想通过HTTP#post_form从外部Ruby脚本发送POST请求到Rails应用程序。该请求是针对create动作(即,该URI是http://server/controller)。从外部脚本创建新的rails数据库记录?

如果我编码一个参数到请求,一切都很好:

HTTP::post_form(uri, { :my_param => "value" }) 

虽然我必须明确地从params手动拉出my_param,在控制器中。这看起来效率不高,并且会在应用程序本身内部创建新记录(因为该参数不存在)。因此,我试图让自己的脚本像Rails本身一样,按照控制器期望的那样传递适当的数据,例如,

HTTP::post_form(uri, { :object => { :my_param => "value" } }) 

但是,这是行不通的。 post_form似乎逃避我的哈希成不同的东西,即

{ "object" => [\"my_param\", \"value\"] } 

这显然不会做同样的事情。我在传递数据的方式中缺少明显的东西吗?或者我能否达到我的目标(从应用程序外部创建新记录)?

回答

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,因为参数已经转换为字符串。

+0

优秀,作品谢谢!但是,当值是数组时它似乎分解了。你不会碰巧知道如何处理这种情况吗? – kfb

+0

查看我编辑的帖子 –

+0

太棒了,这是正确的排序。干杯! – kfb

1

我对post_form了解不多,但对我来说自然的解决方案是使用ActiveResource对象。

ActiveResource可用于ruby以及Rails。你使用它,就像你使用一个模型只有它张贴,并使用XML 有关于如何在这里工作

http://railscasts.com/episodes/94-activeresource-basics

http://railscasts.com/episodes/95-more-on-activeresource

我想你会发现这是一个一个Railscast得到更适合您的要求比post_form,但正如我所说,我不熟悉post_form。

+0

谢谢,我会看看那个。我试图保持依赖关系,但我同意它看起来像我想要的:) – kfb

+0

经过一番玩,这种方法的唯一缺点是,它似乎目前不支持ActiveRecord关联(例如has_and_belongs_to_many)。 – kfb

+0

您可以支持相关表格,但必须创建自己的xml模板以包含所需的记录。我会尽力找到时间来更新我的答案。 – jamesc

相关问题