使用Rails无法将NextAuth用户唯一ID存入PostgreSQL数据库
问题解决步骤
核心问题分析
- 参数名不匹配:前端传入的参数是
account_id,但后端代码里取的是params[:user_id],导致根本没获取到要设置的ID值。 - Rails主键默认行为限制:默认情况下,Rails的
id主键是自增整数类型,且不允许通过批量赋值(create方法的哈希参数)手动设置,同时Google用户ID是字符串,和默认的整数类型不兼容。
1. 修正前后端参数匹配
方案一:修改后端代码匹配前端参数
将Rails的create方法里的params[:user_id]改成params[:account_id]:
def create @user = User.create( id: params[:account_id], first_name: params[:first_name], last_name: params[:last_name], last_logged_in: Time.current ) end
方案二:修改前端参数名匹配后端
将前端signInOrCreateUser的参数名改成user_id:
signInOrCreateUser({ user_id: user.id, first_name: 'test', last_name: 'test' })
2. 允许User模型手动设置主键
在User模型中配置,关闭主键自动生成,允许手动赋值:
# app/models/user.rb class User < ApplicationRecord self.primary_key = 'id' self.id = nil # 关闭自动生成主键逻辑 end
如果使用了Strong Parameters规范,需要把id加入允许的参数列表:
def user_params params.permit(:id, :first_name, :last_name) end # 对应修改create方法 def create @user = User.create(user_params.merge(last_logged_in: Time.current)) end
3. 修改数据库表结构适配字符串ID
Google用户ID是字符串类型,需将users表的id字段改为字符串主键:
- 生成迁移文件:
rails generate migration ChangeUsersIdToString
- 编辑迁移文件:
class ChangeUsersIdToString < ActiveRecord::Migration[7.0] def change remove_column :users, :id add_column :users, :id, :string, null: false execute "ALTER TABLE users ADD PRIMARY KEY (id);" end end
- 执行迁移:
rails db:migrate
验证说明
控制台手动创建能成功,是因为控制台环境不受Strong Parameters限制,且Rails在控制台中允许直接赋值主键;而接口请求受自动主键生成逻辑和参数白名单的双重限制,所以需要完成以上三步配置才能正常生效。
内容的提问来源于stack exchange,提问作者Doolan
相关产品推荐
相关产品推荐

