Rails集成Devise-JWT 注册POST请求报NameError: 未定义sign_up_params
Rails Devise-JWT 注册接口NameError报错解决方案
报错核心原因
- 自定义的
RegistrationsController直接继承ApplicationController,未继承Devise内置的Devise::RegistrationsController,因此无法获取Devise内置的sign_up_params参数白名单方法、build_resource资源构建方法等辅助逻辑,触发未定义方法的报错。 - 同理
SessionsController也存在继承错误,后续登录流程会触发同类问题。
分步修复方案
1. 修正控制器继承关系
调整registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController respond_to :json def create build_resource(sign_up_params) resource.save if resource.errors.empty? render json: resource else render json: resource.errors end end private # 自定义注册允许的参数白名单 def sign_up_params params.require(:user).permit(:email, :password) end end
调整sessions_controller.rb
class SessionsController < Devise::SessionsController respond_to :json private def respond_with(resource, _opts = {}) render json: resource end def respond_to_on_destroy head :no_content end end
2. 清理冗余数据库字段
初始迁移中自定义添加的t.string :password为明文存储密码的冗余设计,Devise默认通过encrypted_password字段存储加密后的密码,未上线可直接修改迁移文件删除该字段,已上线需新增加删除字段的迁移。
3. 修正Gemfile依赖分组
devise和devise-jwt为运行时必须依赖,不应放在development/test分组下,调整为全局依赖:
source 'https://rubygems.org' ruby '2.7.2' gem 'rails', '~> 6.1.3' gem 'sqlite3', '~> 1.4' gem 'puma', '~> 5.0' gem 'bootsnap', '>= 1.4.4', require: false # 移到全局分组 gem 'devise' gem 'devise-jwt' group :development, :test do gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] end group :development do gem 'listen', '~> 3.3' gem 'spring' end gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
调整后执行bundle install更新依赖。
4. 确认devise-jwt初始化配置
检查config/initializers/devise.rb中是否正确配置JWT参数,核心配置示例:
Devise.setup do |config| # 原有其他devise配置 config.jwt do |jwt| jwt.secret = Rails.application.credentials.devise_jwt_secret_key! jwt.dispatch_requests = [['POST', %r{^/login$}]] jwt.revocation_requests = [['DELETE', %r{^/logout$}]] jwt.expiration_time = 15.minutes.to_i end end
5. 验证修复效果
重启Rails服务后,发起POST /signup注册请求,即可正常完成接口调用。
内容的提问来源于stack exchange,提问作者user14068539
相关产品推荐
相关产品推荐

