Ruby on Rails嵌套资源REST API任务接口实现咨询
Rails嵌套资源下用户专属任务接口实现方案
你已经完成模型层Person has_many :tasks、Task belongs_to :person的关联配置的前提下,按以下步骤实现即可,后续的任务修改、删除接口也可以基于这套结构扩展:
1. 配置嵌套路由
首先修改config/routes.rb,将tasks定义为people的嵌套资源,框架会自动生成符合REST规范的路径映射:
Rails.application.routes.draw do resources :people do # 后续需要实现更新、删除接口时,直接把:update、:destroy加到only数组里即可 resources :tasks, only: [:index, :create] end end
配置完成后在项目根目录执行rails routes命令可以校验路由规则,能看到/people/:person_id/tasks路径的GET请求映射到tasks#index动作、POST请求映射到tasks#create动作,注意这里URL中用户ID对应的参数名是person_id,不要和任务自身的id参数混淆。
2. 抽取公共前置逻辑
两个接口都需要先根据URL中的用户ID定位到对应的Person记录,直接在控制器中写前置回调复用逻辑,避免重复代码:
class TasksController < ApplicationController # 执行index、create动作前先查找关联的用户 before_action :find_related_person private def find_related_person @person = Person.find(params[:person_id]) # 如果需要做用户不存在的容错,可以在这里捕获ActiveRecord::RecordNotFound异常,返回404状态码和对应提示 end end
3. 实现两个核心接口逻辑
获取指定用户任务列表(GET /people/{id}/tasks)
直接通过Active Record关联取当前用户下的所有任务,返回JSON格式即可:
def index @tasks = @person.tasks render json: @tasks end
为指定用户新建任务(POST /people/{id}/tasks)
这里需要处理两个核心规则:一是新任务自动绑定当前URL对应的用户,二是请求未传status字段时默认设为active:
def create # 通过用户关联构建任务,会自动填充person_id,避免手动传参导致的归属错误 @task = @person.tasks.build(task_params) # 未指定status时默认设为active @task.status ||= "active" if @task.save render json: @task, status: :created else render json: { errors: @task.errors.full_messages }, status: :unprocessable_entity end end private # 配置任务参数白名单,按需添加你自己定义的任务字段即可 def task_params params.require(:task).permit(:title, :description, :status, :due_time) end
后续实现任务修改、删除接口时,只需要再加一个前置回调,通过
@person.tasks.find(params[:id])查找目标任务,就能天然保证操作的任务一定属于当前URL对应的用户,不会出现跨用户越权操作的问题,后续的update、destroy动作写法和普通非嵌套资源完全一致。
内容的提问来源于stack exchange,提问作者Efim Risberg
相关产品推荐
相关产品推荐

