Reputation: 940
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
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
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