如何在Rails资源声明中禁用update动作的PATCH请求路由?
解决Rails资源路由禁用PATCH请求的问题
嘿,我来帮你搞定这个问题~首先得指出你当前代码里的小问题:resources :groups, :user_connections, :users, except: [:patch] 是无效的,因为except参数是用来排除控制器动作(比如:index、:update这类),而不是HTTP请求方法(像PATCH、PUT这种)。Rails默认会给:update动作同时生成PUT和PATCH两种HTTP方法的路由,所以咱们得换个方式来禁用PATCH。
下面给你几个可行的方案:
方案1:自定义资源路由,仅允许PUT方法
直接在资源声明里用member块手动定义update路由,指定只接受PUT请求:
resources :groups, :user_connections, :users do member do put :update # 仅生成PUT /:resource/:id 的路由 end end
这样配置后,Rails就不会生成PATCH对应的update路由了,只有PUT请求会被映射到控制器的update方法。
方案2:排除默认update路由,手动添加仅PUT的版本
先排除默认的:update动作,再手动为每个资源添加只允许PUT的update路由:
# 先排除默认的update动作 resources :groups, :user_connections, :users, except: [:update] # 手动添加仅接受PUT的update路由 [:groups, :user_connections, :users].each do |resource_name| put "#{resource_name}/:id", to: "#{resource_name}#update", as: "update_#{resource_name}" end
这个方案和方案1效果一样,适合需要更精细控制路由的场景。
方案3:在控制器中拒绝PATCH请求(不修改路由)
如果不想调整路由结构,也可以在控制器的update方法里直接拒绝PATCH请求:
def update # 检测到PATCH请求就返回405 Method Not Allowed if request.patch? head :method_not_allowed return end # 你的原有update逻辑代码 end
这种方式不需要改路由,直接在业务层拦截PATCH请求,返回标准的HTTP错误码。
简单总结下:Rails的resources默认把PUT和PATCH都绑定到update动作,所以不能用except: [:patch]来禁用,得通过上面的方法来针对性处理~
内容的提问来源于stack exchange,提问作者J Edward Ellis
相关产品推荐
相关产品推荐

