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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 08:06:03