使用Devise创建含username与角色的新用户时遇NoMethodError错误
问题解决:Devise 参数 sanitizer
for 方法不存在错误 我使用 Rails 7、Devise 和 Rolify 开发应用,计划通过 Friendly ID 为数据库表生成 URL 别名,已为 User 表添加 username 字段,完成现有用户记录的字段更新,并修改 User 模型实现基于 username 的友好 URL。但创建新用户时触发错误:
NoMethodError (undefined method `for' for #<Devise::ParameterSanitizer:0x00007fc11795a7b0 ...>): app/controllers/application_controller.rb:10:in `configure_permitted_parameters'
参考 Devise 官方文档添加参数配置代码后仍出现问题,以下是相关代码:
application_controller.rb 代码
class ApplicationController < ActionController::Base respond_to :html, :json protect_from_forgery with: :exception before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) do |u| u.permit(:email, :username, :password, :password_confirmation) end end def require_user unless user_signed_in? flash[:alert] = "You must be logged in to perform that action" redirect_to new_user_session_path end end end
User 模型代码
class User < ApplicationRecord has_many :events, dependent: :destroy has_many :artists, dependent: :destroy rolify # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable validates :email, presence: true, uniqueness: { case_sensitive: false }, length: { maximum: 105 }, format: { with: URI::MailTo::EMAIL_REGEXP } validates :password, :presence => true, :on => :create validates :username, :presence => true, :on => :create validates_uniqueness_of :username, case_sensitive: false validates :roles, presence: true extend FriendlyId friendly_id :username, use: :slugged def admin? self.has_role?(:Admin) end end
问题原因
Rails 7 配套的 Devise 版本已弃用 devise_parameter_sanitizer.for 方法,改用 permit 方法作为参数校验的标准语法。
修复方案
修改 application_controller.rb 中的 configure_permitted_parameters 方法:
简洁写法
def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:email, :username, :password, :password_confirmation]) end
支持复杂逻辑的块写法
def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up) do |user_params| user_params.permit(:email, :username, :password, :password_confirmation) end end
说明
Devise 从 4.2+ 版本开始推荐使用 permit 替代 for,Rails 7 对应的 Devise 版本已完全移除 for 方法,因此会触发方法不存在的错误。修改后即可正常允许 username 等参数通过校验,新用户创建流程将恢复正常。
内容的提问来源于stack exchange,提问作者Ogarocious
相关产品推荐
相关产品推荐

