Rails API创建新条目时所有字段值为nil的问题排查
问题分析
从Rails服务器日志可以明确看到核心问题:
Parameters: {"{\r\n \"username\": \"John\",\r\n \"title\": \"DC\",\r\n \"desc\": \"not bad\",\r\n \"rating\": \"4\",\r\n \"lat\": \"37.689\",\r\n \"long\": \"41.987\"\r\n}"=>nil}
Rails没有正确解析你的JSON请求体,而是把整个JSON字符串当作了一个参数键,对应的值为nil,这就导致params[:username]、params[:title]等所有字段都取不到值,最终存入数据库的都是nil。
解决方案
1. 修正Postman的请求配置
- 设置请求头:在Postman的Headers标签中添加
Content-Type: application/json,这是让Rails识别并自动解析JSON请求体的关键。 - 确认请求体格式:在Postman的Body标签中选择
raw格式,然后在下拉菜单中选择JSON,再粘贴你的JSON内容,确保没有多余的换行或格式错误。
2. 恢复控制器的安全参数写法
你的控制器中已经定义了pin_params方法,这是Rails推荐的强参数写法,应该恢复使用它,而不是直接从params中取值:
def create pin = Pin.create!(pin_params) render json: pin, status: :created end private def pin_params params.permit(:username, :title, :desc, :rating, :lat, :long) end
3. 可选:关闭CSRF验证(仅开发环境)
日志中出现Can't verify CSRF token authenticity.,虽然这不是本次字段为nil的原因,但如果是开发环境测试API,可以在控制器中临时关闭CSRF验证:
class PinsController < ApplicationController skip_before_action :verify_authenticity_token, only: [:create] # ... 其他方法 end
内容的提问来源于stack exchange,提问作者Connor Cyphers
相关产品推荐
相关产品推荐

