You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React向Rails发送PATCH请求遇422错误,布尔值更新异常

问题解决思路

核心问题分析

从服务器日志能看到,请求参数中出现了未被允许的:game嵌套字段,同时你的update动作响应逻辑不符合API场景,这两个问题共同导致了422错误和后续的参数警告。


1. 修复参数格式不匹配

方案一:调整前端请求参数结构(推荐)

Rails的RESTful接口默认期望参数嵌套在模型名对应的键下,修改saga中的请求内容,将own字段包装到game对象中:

function* updateGame(action) {
  try {
    // 仅传递需要更新的own字段,包装在game键下
    const requestData = { game: { own: action.payload.own } }
    yield axios.patch(`/api/v1/games/update/${action.payload.id}`, requestData)
    yield put({ type: 'FETCH_GAMES' })
  } catch (err) {
    console.error("Error updating game", err)
  }
}

方案二:修改Rails控制器参数解析逻辑

如果不想调整前端,可以修改game_params方法,从嵌套的:game参数中获取允许的字段:

private
def game_params
  params.require(:game).permit(:title, :own, :image_url, :genre_id)
end

2. 修正update动作的响应格式

当前update方法成功时返回HTML重定向,不符合API请求的预期,改成返回JSON格式:

def update
  @game = Game.find(params[:id])

  if @game.update(game_params)
    render json: @game, status: :ok
  else
    render json: @game.errors, status: :unprocessable_entity
  end
end

3. 路由优化(可选)

当前的patch 'games/update/:id'不符合Rails RESTful规范,建议改用resources自动生成路由:

Rails.application.routes.draw do
  namespace :api do
    namespace :v1 do
      resources :games, only: [:index, :create, :update, :destroy]
      resources :genres, only: [:index, :create, :destroy]
    end
  end

  root 'pages#home'
end

修改后,update接口的路径变为PATCH /api/v1/games/:id,前端请求时可以去掉路径中的/update/部分。


关于CSRF的补充说明

添加protect_from_forgery with: :null_session能快速解决API的CSRF问题,但生产环境建议使用Token认证(如JWT)来替代,提升接口安全性。

内容的提问来源于stack exchange,提问作者johnturner4004

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:45:29