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
相关产品推荐
相关产品推荐

