When adding custom attributes to your Devise models (e.g., username), you must permit them via the devise_parameter_sanitizer in your ApplicationController. This is necessary because Devise only permits a default set of parameters for sign_in, sign_up, and account_update actions.
You can permit simple scalar values or use a block for more complex logic like nested attributes or arrays (e.g., checkboxes).
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
# For simple scalar types
devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
# For nested attributes
devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name, address_attributes: [:country, :state, :city, :area, :postal_code]])
# For arrays (e.g., checkboxes)
devise_parameter_sanitizer.permit(:sign_up) do |user_params|
user_params.permit({ roles: [] }, :email, :password, :password_confirmation)
end
end
end