“ ghost”参数传递给控制器

时间:2018-10-09 20:47:52

标签: ruby-on-rails rspec ruby-on-rails-5 rspec-rails

我进行了以下测试:

it 'will pass with valid pageConfig json structure' do 
  document = create(:document, :complete, :belongs_to_user, user_id: @user.id, workspace_id: @workspace.id)
  put :update, params: {id: document.id, pageConfig: {size: {width: 1, height: 1}, margin: {top: 1, bottom: 1, left: 1, right: 1}}, workspace_id: @workspace.id}, as: :json
  expect(document.reload.page_config).to eq({"size": {"width": 1, "height": 1}, "margin": {"top": 1, "left": 1, "right": 1, "bottom": 1}})
end 

调试update端点时,这些参数是:

<ActionController::Parameters {"pageConfig"=>{"size"=>{"width"=>1, "height"=>1}, "margin"=>{"top"=>1, "bottom"=>1, "left"=>1, "right"=>1}}, "workspace_id"=>1, "id"=>"1", "format"=>"json", "controller"=>"documents", "action"=>"update", "document"=>{"workspace_id"=>1}} permitted: false>

如您所见,宽度,高度和workspace_id均应为整数,但由于验证而导致测试失败:

Validator of Parameters - Unknown parameter document

参数上的最后一个条目是document =>,我根本没有提供。

当我从as: :json更改为format: :json时,document参数消失了(我想要),但所有其他参数都解析为字符串:

<ActionController::Parameters {"pageConfig"=>{"margin"=>{"bottom"=>"1", "left"=>"1", "right"=>"1", "top"=>"1"}, "size"=>{"height"=>"1", "width"=>"1"}}, "workspace_id"=>"1", "id"=>"1", "format"=>"json", "controller"=>"documents", "action"=>"update"} permitted: false>

,现在其他验证失败,因为它们是字符串。

如何使用as: :json使它工作并使document消失?

我正在将Rails 5.2.0与RSpec 3.8.0一起使用

1 个答案:

答案 0 :(得分:0)

您为什么认为:as:format是排他性的?我做了一些测试

put '/', params: {id: 1000, pageConfig: {size: {width: 1, height: 1}, margin: {top: 1, bottom: 1, left: 1, right: 1}}, workspace_id: 10001}

{:action=>"/", :controller=>"redacted", :id=>1000, :pageConfig=>{:size=>{:width=>1, :height=>1}, :margin=>{:top=>1, :bottom=>1, :left=>1, :right=>1}}, :workspace_id=>10001}

put '/', params: {id: 1000, pageConfig: {size: {width: 1, height: 1}, margin: {top: 1, bottom: 1, left: 1, right: 1}}, workspace_id: 10001}, as: :json 

{:action=>"/", :controller=>"redacted", :format=>:json, :id=>1000, :pageConfig=>{:size=>{:width=>1, :height=>1}, :margin=>{:top=>1, :bottom=>1, :left=>1, :right=>1}}, :workspace_id=>10001} 

put '/', params: {id: 1000, pageConfig: {size: {width: 1, height: 1}, margin: {top: 1, bottom: 1, left: 1, right: 1}}, workspace_id: 10001}, format: :json  

{:action=>"/", :controller=>"redacted", :format=>:json, :id=>1000, :pageConfig=>{:size=>{:width=>1, :height=>1}, :margin=>{:top=>1, :bottom=>1, :left=>1, :right=>1}}, :workspace_id=>10001} 

如您所见,我从未遇到过这种“鬼”参数(尽管我在Rails-6.0.0上进行了测试)

我怀疑有一些时髦的宝石为您弄乱了东西。

您可以做什么:启动香草Rails应用程序,然后尝试重现它。如果不能-几乎可以肯定这是一些宝石。

如果可以的话-很有可能是Rails的错误。