body = { a: 1 }.to_json
params = { b: 2 }
post(:create, body: body, params: params, as: :json)
控制器中有params[:a]
但没有params[:b]
?
也许body
正在担任总统,因为解析体在控制器中成为params
,但在这种情况下,我如何也传递URL参数?
如果我删除as: :json
,我会看到params
中的URL参数,但不是解析的JSON体,因为MIME类型是text/html
而不是text/json
。
body
是从fixture中加载的,必须按原样发送,因为它的主体是签名的,所以它不能与params
合并,即params: JSON.parse(body).merge(params)
。
我可以像这样解决这个问题:
request.query_string = "b=2"
post(:create, body: body, params: params, as: :json)
在这种情况下,我得到params
的URL和body参数,所以似乎Rails控制器在给出JSON体和URL参数时做了正确的事情。
如果我们这样改变路由:
post '/foo?a=:a', to: 'foos#create'
我们最终在params
中定义了URL参数和body参数。