Marat
Marat

Reputation: 672

Can't add custom fields to Devise model in Ruby on Rails. Private method error

Generated User model using Devise gem.

Trying to add 'username' attribute.

Followed official documentation, now my ApplicationController looks like this:

class ApplicationController < ActionController::Base

  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?
  before_action :authenticate_user!

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:account_update, keys: [:username])
    devise_parameter_sanitizer.permit(:sign_in, keys: [:username])
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
  end

end

When I try to go to account update page I get following error:

NoMethodError in Devise::RegistrationsController#edit

private method `permit' called for #Devise::ParameterSanitizer:0x007f13396cf180>

What can be wrong in here?

Upvotes: 11

Views: 4951

Answers (2)

Saiqul Haq
Saiqul Haq

Reputation: 2397

Below answer might be outdated for you, so please read the source code instead HERE


First thing that you should aware is your devise version so check the installed version on your rails app by do following command:

cat Gemfile.lock | grep devise

it shows which devise version that installed on your rails app, it's like:

devise (= 3.1.0)

If your devise's version is >= 4.0.0.rc1

def configure_permitted_parameters
  devise_parameter_sanitizer.permit(:sign_up) do |user_params|
    user_params.permit({ roles: [] }, :email, :password, :password_confirmation)
  end
end

for version < 4.0.0.rc1

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_in)        << :username
  devise_parameter_sanitizer.for(:sign_up)        << :username
  devise_parameter_sanitizer.for(:account_update) << :username
end 

Upvotes: 18

Richard Peck
Richard Peck

Reputation: 76774

According to this answer, you can also do the following:

def configure_permitted_parameters
   devise_parameter_sanitizer.for(:sign_in)        << :username
   devise_parameter_sanitizer.for(:sign_up)        << :username
   devise_parameter_sanitizer.for(:account_update) << :username
end

Upvotes: 18

Related Questions