Rails:如何将请求参数重构成所需的目标结构
实现方案
核心需求有两个:一是将嵌套的ActionController::Parameters类型的volunteer_shift_attributes转为普通Ruby哈希,二是自定义修改set_date、notes两个字段的值,直接在控制器方法内做如下处理即可:
def create_shift # 复制原始参数,避免修改原参数对象影响其他逻辑 assignment_params = params["assignment"].dup # 转换嵌套属性为普通哈希 assignment_params["volunteer_shift_attributes"] = assignment_params["volunteer_shift_attributes"].to_h # 按需修改指定字段的值 assignment_params["set_date"] = "2021-01-15" assignment_params["notes"] = "aaaaaaaaaaaaaa" # 赋值给模型属性 a.attributes = assignment_params # 后续原有逻辑 ... end
如果希望把参数处理逻辑收敛到强参数方法中,也可以按如下方式配置:
# 强参数白名单配置 def assignment_params params.require(:assignment).permit( :set_date, :contact_id, :closed, :'start_time(4i)', :'start_time(5i)', :'end_time(4i)', :'end_time(5i)', :notes, volunteer_shift_attributes: [:volunteer_task_type_id, :roster_id, :program_id, :set_description] ).tap do |permitted_params| # 强参数阶段就完成嵌套属性的类型转换 if permitted_params[:volunteer_shift_attributes].present? permitted_params[:volunteer_shift_attributes] = permitted_params[:volunteer_shift_attributes].to_h end end end # create_shift 方法直接使用处理后的参数即可 def create_shift ... processed_params = assignment_params # 自定义修改字段值 processed_params["set_date"] = "2021-01-15" processed_params["notes"] = "aaaaaaaaaaaaaa" a.attributes = processed_params ... end
注意事项
- 不要直接修改原
params["assignment"]对象,避免影响其他依赖该参数的逻辑 - Rails 5.2及以上版本中,已经过
permit授权的ActionController::Parameters对象本身可直接赋值给模型属性,不需要手动转哈希。如果你不需要修改set_date、notes的字段值,直接使用强参数配置即可满足需求
内容的提问来源于stack exchange,提问作者thefonso
相关产品推荐
相关产品推荐

