是否可以在Rails 4中禁用标准PUT路由?

Pet*_*wka 11 ruby-on-rails ruby-on-rails-4

PATCH在对对象进行(常见)部分更新时,Rails 4引入了请求作为默认请求方法.这符合HTTP标准,可以在此处找到讨论此决定的好(较旧)帖子:

http://weblog.rubyonrails.org/2012/2/25/edge-rails-patch-is-the-new-primary-http-method-for-updates/

当您在config/routes.rb类似中定义资源时

    resources :books
Run Code Online (Sandbox Code Playgroud)

然后在rails 4中默认创建以下路由:

    GET     /books       books#index
    GET     /books/:id   books#show
    POST    /books       books#create
    DELETE  /books/:id   books#destroy
    PATCH   /books/:id   books#update
    PUT     /books/:id   books#update
Run Code Online (Sandbox Code Playgroud)

由于我正在开发一个新的应用程序而不必关心向后兼容性,我想删除过时的PUT路由.

有没有一种简单的方法来实现这一目标config/routes.rb?


解释为什么这PUT条路线困扰我:我使用swagger-docs gem为我的API自动生成一个swagger文档.由于所描述的行为,我总是有两个端点定义用于每个资源的更新请求(PUT和PATCH).此外,由于这是一个可能不赞成的路线,我希望我的API从今天起不支持它.


更新由于第一个答案朝着错误的方向前进,我想澄清一下:我不想删除'更新'动作,而只是保留PATCH路线时只删除过时的PUT路线.

Pet*_*wka 8

回答我自己的问题:不,目前无法在rails 4中禁用PUT/PATCH组合的默认生成,这在查看https:// github上的ActionDispatch :: Routing源时可以清楚地看到. com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/mapper.rb,特别是那些行:

      def set_member_mappings_for_resource
        member do
          get :edit if parent_resource.actions.include?(:edit)
          get :show if parent_resource.actions.include?(:show)
          if parent_resource.actions.include?(:update)
            patch :update
            put :update
          end
          delete :destroy if parent_resource.actions.include?(:destroy)
        end
      end
Run Code Online (Sandbox Code Playgroud)

显然,(目前)没有条件排除该PUT路线.我将准备一个问题或提出请求,并稍后返回结果.

在那之前,最好的解决方法将是Jorge de los Santos所建议的,尽管这会污染很多config/routes.rb.


teb*_*oso 7

是的,检查文档:

http://guides.rubyonrails.org/routing.html#restricting-the-routes-created

resources :photos, except: :update
Run Code Online (Sandbox Code Playgroud)

PATCH和PUT用于不同用途.只要更新是部分的,您应该使用PATCH,但如果您要更新所有内容,则必须使用PUT.这听起来很混乱,但是例如假设您正在更新关联模型,只要您不修改部分信息,这可能被视为放置操作而不是补丁,您将更新整个关系.

此外,PUT用于更新或创建,在添加嵌套资源时可能会发现大豆很有用.

http://weblog.rubyonrails.org/2012/2/25/edge-rails-patch-is-the-new-primary-http-method-for-updates/

---------------用解决方案编辑:

要覆盖放置广告:

PATCH 'route', to: 'books#update'
resources :books, except: :update
Run Code Online (Sandbox Code Playgroud)

Rails将在资源之前捕获补丁,并将禁用put和patch以进行更新.

参考:

在Rails中覆盖"show"资源路由