“ ghost”参数传递给控制器

问题描述 投票:0回答:1

我有以下测试:

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均为应为integer,但由于验证而导致测试失败:

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中使用

ruby-on-rails rspec ruby-on-rails-5 rspec-rails
1个回答
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的错误。

© www.soinside.com 2019 - 2024. All rights reserved.