Rails创建PlanTask时如何将project_id纳入plan_task强参数许可
实现方案
核心原因
当前请求的project_id是与plan_task平级的顶层参数,并非嵌套在plan_task的参数哈希内,直接在permit列表中新增:project_id无法读取到该值,需要先将顶层的project_id关联到plan_task的参数处理流程中。
具体实现方式
方案1(推荐,适配嵌套路由场景)
通过merge将顶层的project_id合并到过滤后的强参数中,修改后的plan_task_params方法如下:
def plan_task_params params.require(:plan_task) .permit(:name, :owner_id, :wbs, :description) .merge(project_id: params[:project_id]) end
这种写法的优势是:project_id完全取自路由层传入的顶层参数,用户无法通过篡改请求中plan_task字段的同名参数来修改任务所属项目,安全性更高,是Rails嵌套路由场景下的常规写法。合并后的参数依然是合规的强参数对象,可直接传递给模型的创建、更新方法使用。
方案2(统一走强参数校验)
如果你希望project_id也纳入强参数的校验范围,可以先将顶层的project_id合并到plan_task的原始参数哈希中,再统一声明允许的字段:
def plan_task_params # 用顶层路由传入的project_id覆盖用户可能提交的同名字段 params[:plan_task] = params[:plan_task].merge(project_id: params[:project_id]) params.require(:plan_task) .permit(:name, :owner_id, :wbs, :description, :project_id) end
这种写法同样会以路由层的project_id为准,所有最终返回的参数都经过强参数的白名单过滤,适合需要统一校验所有字段的场景。
注意事项
不要直接在原有permit列表中新增:project_id,该写法仅能读取嵌套在plan_task哈希下的同名字段,无法获取当前平级的顶层project_id。
内容的提问来源于stack exchange,提问作者user9759491
相关产品推荐
相关产品推荐

