好的,
我正在将Rails 3应用程序从Rails 3.2升级到Rails 4.2。阅读完升级说明和更改后,我们遇到了一些奇怪的问题PUT
和PATCH
路线。
在Rails 3应用程序中,我们定义了以下路由:
resources :entities, except: [:show] do
member do
put :change_monitoring_status
end
end
运行时rake routes
,该change_monitoring_status
路线将显示为正确的PUT
路线。使用Rails帮助器为此生成的表单会在Rails 3中生成正确的请求。
但是,在Rails 4中,此表单现在正在生成PATCH
路线。完全可以,因为这已成为Rails中的标准行为。但是,当我们在Rails 4 Production上使用表单时,结果为404 - Not Found
。
我们试图为此编写一个RSpec测试,以模仿相同的行为并关闭错误凭单。因此,对于Rails 4升级,我们编写了以下测试:
describe '#change_monitoring_status' do
before(:each) do
sign_in user
end
it 'fails when put is used' do
expect {
put :change_monitoring_status, id: entity.id, _method: "PUT", form_object: { }
}.to raise_error
end
it 'works when patch is used' do
expect {
patch :change_monitoring_status, id: supplier.id, _method: "PATCH", form_object: { }
}.to_not raise_error
end
end
我们还将路线更改为PATCH
而不是PUT
现在。
这是我们看到的行为:
PUT
测试失败on Rails的4,因为没有404上升PATCH
测试成功PUT
请求可用于生产PATCH
请求在生产中失败我们理解这一点的方式与文档不一致。表单正在生成正确的PATCH
请求,但是我们无法在RSpec测试中获得正确的行为。
我们的期望:
PUT
养404PATCH
成功使用的宝石:*滑轨4.2 * RSpec 3.4 * RSpec滑轨3.4 * simple_form 3.2
控制器规范伪造了整个请求周期。该请求从未真正到达路由层-RSpec只是在routes文件中寻找与控制器和操作匹配的路由。
尽管这对提高速度很有帮助,因为您跳过了整个机架层,但有时可能会掩盖路由错误。
您的规格也略有不同;第一用途id: entity.id
,而后者的用途id: supplier.id
。
在这种情况下,我将改用路由规范或请求规范,因为这会导致路由层出现错误-甚至在控制器匹配之前。
describe "change_monitoring_status", type: :routing do
it 'fails when put is used' do
expect(puts: "/entity/37/change_monitoring_status").not_to be_routable
end
it 'works when patch is used' do
expect(patch: "/entity/37/change_monitoring_status").to
route_to(
controller: "entities",
action: "change_monitoring_status",
id: 37
)
end
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句