Bastien Robert
Bastien Robert

Reputation: 940

Can't add new fields on devise - Ruby on Rails

I've just follow the documentation to add new fields on profiles, but It doesn't seems to work. Overtime i get Unpermitted parameters: firstname, lastname, password_confirmation.

This is my model for User :

class User < ApplicationRecord
    devise :database_authenticatable, :registerable, :recoverable, rememberable, :trackable, :validatable
    has_many :issues
    has_many :comments
    has_many :likes

    # Validations
    validates :email, presence: true
    validates :password, presence: true

    # Omniauth
    devise :omniauthable, omniauth_providers: [:facebook]
    # Omniauth Facebook  # Omniauth Facebook
    def self.from_facebook(auth)
        where(facebook_id: auth.uid).first_or_create do |user|
        # user.image = auth.info.image
        user.email = auth.info.email
        user.firstname = auth.info.first_name
        user.lastname = auth.info.last_name
        user.country = auth.info.location
        user.region = ""
        user.password = Devise.friendly_token[0, 20]
        # user.skip_confirmation!
    end
end

## Paperclip avatar
has_attached_file :avatar, styles: {
    big: "1200x1200>",
    medium: "300x300>",
    thumb: "100x100>"
}, default_url: "missing.png"
validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/

end

And this is my application controller, which contains the configuration of new devise fields :

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  # Devise parameters configuration
  before_action :configure_devise_parameters, if: :devise_controller?
  def configure_devise_parameters
      devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit(:email, :avatar, :firstname, :lastname, :region, :country, :bio, :password, :password_confirmation, :current_password) }
      devise_parameter_sanitizer.permit(:account_update) { |u| u.permit(:email, :avatar, :firstname, :lastname, :region, :country, :bio, :password, :password_confirmation, :current_password) }
  end
end

Upvotes: 0

Views: 106

Answers (2)

Junan Chakma
Junan Chakma

Reputation: 651

I added two new fields(first_name, last_name) on User model. Then I overrided devise's RegistrationsController by creating a registrations_controller.rb like this

class RegistrationsController < Devise::RegistrationsController

  private

  def sign_up_params
    params.require(:user).permit(:first_name, :last_name, :email, 
    :password, :password_confirmation)
  end

  def account_update_params
    params.require(:user).permit(:first_name, :last_name, :email, 
    :password, :password_confirmation, :current_password)
  end

And updated my devise routes in routes.rb file like

devise_for :users, :controllers => { registrations: 'registrations' }

It worked for me!

Upvotes: 1

Pedro Holguin
Pedro Holguin

Reputation: 66

Create a users directory

mkdir app/controllers/users

create a controller called registrations_controller.rb

# app/controller/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
 before_action :configure_sign_up_params, only: [:create]
 before_action :configure_account_update_params, only: [:update]


 protected

 def configure_sign_up_params
  devise_parameter_sanitizer.permit(:sign_up, keys: [:firstname, :lastname, :email, :avatar, :password, :password_confirmation])
 end

 def configure_account_update_params
  devise_parameter_sanitizer.permit(:account_update, keys: [:firstname,:lastname,:email, :avatar, :password, :password_confirmation])
 end
end

and omniauth_callbacks_controller.rb

# app/controller/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
 def facebook
  @user = User.from_omniauth(request.env["omniauth.auth"])

  if @user.persisted?
   sign_in_and_redirect @user, :event => :authentication
   set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?
  else
   session["devise.facebook_data"] = request.env["omniauth.auth"]
   redirect_to new_user_registration_url
  end
 end
end

in routes.rb

devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks', registrations: "users/registrations" }

in user.rb

def self.from_omniauth(auth)
 where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
  user.firstname = auth.info.first_name
  user.lastname = auth.info.last_name
  user.email = auth.info.email
  user.avatar = process_url(auth.info.image + '?type=large')
  user.password = Devise.friendly_token[0,20]
 end
end

def self.process_url(uri)
 avatar_url = URI.parse(uri)
 avatar_url.scheme = 'https'
 avatar_url.to_s
end

Upvotes: 0

Related Questions