【发布时间】:2017-06-27 12:57:54
【问题描述】:
我正在尝试测试我的 ruby API,但在发送正确的数据格式时遇到了一些困难。我可以从 rspec 控制器测试轻松创建所需的数据格式。并且测试通过。
这是我期望控制器上的数据:
{
agreements: [
{
agreement_id: 1,
money_value: 500,
},
{
agreement_id: 2,
money_value: 1500
},
]
}
并且在我的控制器中有这个期望数据格式如下:
def permitted_params
params.permit(agreements:
[
:agreement_id,
:money_value
]).require(:agreements)
end
但是,当我尝试使用 HTTP 客户端对其进行测试时,方法如下:
data = {:agreements =>[{:agreement_id =>1, :money_value =>500}, {:agreement_id =>2, :money_value =>1500}]}
req = Net::HTTP::Post.new(uri)
req.set_form_data(data)
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(req)
end
我收到了 400 个错误请求。尽管一切看起来都正确,但是在服务器端,当我检查请求时,我得到了这个参数(相关部分):
<ActionController::Parameters {"agreements"=>"{:agreement_id =>2, :money_value=>1500}"
这告诉我两件事,首先它将协议视为哈希而不是数组,而且它只看到该哈希的最后一个元素(因为它是相同的键)。
我做错了什么?为什么我的请求是用哈希而不是数组构造的?
问题更新:
这是与 400 相关的错误:
param is missing or the value is empty: agreements
我也在使用 rails 5。
【问题讨论】:
-
日志中的哪些错误信息与 400 相关联?
-
@Anthony 这里是大型堆栈跟踪的摘要:
param is missing or the value is empty: agreements -
注意
{"agreements"=>"{:agreement_id =>2, :money_value=>1500}"这里的值是另一个字符串而不是哈希/json对象。我不认为set_form_data是你想要的。你能试试这样的吗:stackoverflow.com/a/21263005/3109182
标签: ruby-on-rails ruby ruby-on-rails-4 rspec ruby-on-rails-5