Rails中的PATCH和PUT路线升级

编码兔子

好的,

我正在将Rails 3应用程序从Rails 3.2升级到Rails 4.2。阅读完升级说明和更改后,我们遇到了一些奇怪的问题PUTPATCH路线。

在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 养404
  • PATCH 成功

使用的宝石:*滑轨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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Rails升级中的PATCH和PUT路线

来自分类Dev

Rails中的链接和路线

来自分类Dev

使用PATCH / PUT rails API

来自分类Dev

Rails AJAX PUT / PATCH错误

来自分类Dev

导轨中的 put 和 patch 有什么区别?

来自分类Dev

Rails-设计路线和Sidekiq路线

来自分类Dev

使用Devise和Rails-api对401未授权进行PUT / PATCH / DELETE

来自分类Dev

在Rails中别名化路线

来自分类Dev

用户在Rails中定义的路线

来自分类Dev

限制Rails中的资源路线

来自分类Dev

在Rails中别名化路线

来自分类Dev

何时在 AngularJS 中使用 PATCH 和 PUT

来自分类Dev

在PUT路线Laravel中访问文件

来自分类Dev

Rails路线匹配“位置”和“位置”

来自分类Dev

Rails路线和控制器动作

来自分类Dev

Rails 4-路线和路径

来自分类Dev

如何在Ruby on Rails中添加自定义路线,控制器和动作?

来自分类Dev

如何避免Rails“显示”路线中的序数,整数路线?

来自分类Dev

Rails禁用POST / PUT / PATCH主体的JSON解析

来自分类Dev

Rails 4-使用PUT代替PATCH进行更新

来自分类Dev

测试中找不到Rails路线

来自分类Dev

在Rails中访问自定义路线

来自分类Dev

在Rails中创建自定义路线

来自分类Dev

如何在Rails中制作可变路线

来自分类Dev

在path.rb文件中的Rails路线

来自分类Dev

在Rails中干燥作用域内的路线

来自分类Dev

测试中找不到Rails路线

来自分类Dev

Rails中的自定义方法路线

来自分类Dev

在Rails中更改路线路径