如何在Rails中拆分资源的PUT/PATCH请求到不同控制器动作
解决Rails中PUT和PATCH请求映射到不同动作的问题
Rails默认的resource/resources路由会把PUT和PATCH请求都映射到控制器的update动作,但如果要遵循HTTP规范,让PATCH请求对应部分更新(update动作)、PUT请求对应全量替换(replace动作),可以通过手动定义路由实现:
方法一:直接独立定义路由
如果不需要其他RESTful动作,或者想完全自定义路由,直接写两条路由规则即可:
# PATCH请求:处理foo资源的部分更新 patch '/foo/:id', to: 'foos#update' # PUT请求:处理foo资源的全量替换 put '/foo/:id', to: 'foos#replace'
方法二:结合resources保留其他REST动作
如果需要保留index、show、create、destroy等其他RESTful动作,仅修改PUT和PATCH的映射,可以这样配置:
# 先排除默认的update动作,避免路由冲突 resources :foo, except: [:update] do # 给单个资源(member)单独定义PATCH和PUT路由 patch '', on: :member, to: 'foos#update' put '', on: :member, to: 'foos#replace' end
最后记得在FoosController中实现replace方法,处理全量替换的业务逻辑(比如要求参数包含资源的所有必填字段),而update方法仅处理传入的部分字段更新。
内容的提问来源于stack exchange,提问作者niborg
相关产品推荐
相关产品推荐

