Я поддерживаю приложение Rails, которому около 2 лет. В последние месяцы пользователи сообщали об ошибках при попытке создать новую учетную запись пользователя (ранее проблем не было). Просматривая журналы, я обнаружил, что учетные записи пользователей Devise создаются без адреса электронной почты и имени пользователя. Это не должно быть возможно, так как оба поля являются обязательными. Электронная почта является уникальным идентификатором для пользователя, так что это, очевидно, нарушает все виды вещей.
Я проверил локально и не смог воспроизвести проблему. Затем я проверил его на сервере - там я вижу в журналах, что при создании пользователя два параметра не включаются в INSERT.
Local
Processing by RegistrationsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"0JW4oOs+D9plubsIxDxO2N8RjiQtCpuSNE92hJqCQ/N6QkYTFPqnSxmSeqhiKBFFySCzRgG3L+TbQJKZCF9zmQ==", "user"=>{"username"=>"jantesting1", "email"=>"jantesting1@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "team_code"=>"cat45", "num_team_members"=>"0", "accept_terms"=>"1"}, "commit"=>"Sign up"}
##### current_user does not exist #####
Team Exists (0.4ms) SELECT 1 AS one FROM `teams` WHERE `teams`.`code` = 'cat45' LIMIT 1
↳ app/controllers/registrations_controller.rb:4
(0.2ms) BEGIN
↳ app/controllers/registrations_controller.rb:5
User Exists (1.5ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'jantesting1@gmail.com' LIMIT 1
↳ app/controllers/registrations_controller.rb:5
User Create (0.6ms) INSERT INTO `users` (`email`, `encrypted_password`, `created_at`, `updated_at`, `username`) VALUES ('jantesting1@gmail.com', '$2a$11$TiHmwBmI/FmcSXk.ypKu2esrr9nKGoEpjiDPaxQanlD7n6ZQx3/T2', '2020-01-29 18:05:22', '2020-01-29 18:05:22', 'jantesting1')
↳ app/controllers/registrations_controller.rb:5
(0.3ms) COMMIT
Сервер
Processing by RegistrationsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"LrjPR95LZzIEFQH5PEWpkX0GI/q4xnJp+UVmT5gcjbxlbH8IsBbETL0l7xg5w6c33dx7yBZ1ztQVhpvigDjjgg==", "user"=>{"username"=>"jantesting1", "email"=>"jantesting1@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "team_code"=>"yak44", "num_team_members"=>"3", "accept_terms"=>"1"}, "commit"=>"Sign up"}
##### current_user does not exist #####
Team Exists (0.5ms) SELECT 1 AS one FROM `teams` WHERE `teams`.`code` = 'yak44' LIMIT 1
(0.2ms) BEGIN
User Exists (0.3ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'jantesting1@gmail.com' LIMIT 1
User Create (0.2ms) INSERT INTO `users` (`encrypted_password`, `created_at`, `updated_at`) VALUES ('$2a$11$3MBvOEWhpb7IhoH8tl7YXemCZHWxea0FA/b8Ww90m3oEx.hYFJwuK', '2020-01-30 12:21:45', '2020-01-30 12:21:45')
(2.1ms) COMMIT
Более того, насколько я могу судить, эта проблема начала возникать недавно, без каких-либо изменений в кодовой базе. Я проверил, что оба имеют одно и то же состояние git, что все соответствующие библиотеки имеют одинаковые версии (в любом случае, в основном это Gemfile) и т. Д. c. Я git проверил более старую версию кода, и проблема все еще сохраняется там.
Наконец, и, возможно, самое странное, некоторые пользователи смогли создать учетные записи в последние пару недель (ie, где электронная почта не пуста). Но не большинство. И не я.
Любые предложения о том, где искать?
application_controller
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:email, :username, :password, :password_confirmation, :remember_me, :team_code, :num_team_members, :accept_terms])
devise_parameter_sanitizer.permit(:sign_in, keys: [:login, :email, :password, :remember_me, :num_team_members])
devise_parameter_sanitizer.permit(:account_update, keys: [:email, :password, :password_confirmation, :current_password])
end
registrations_controller
class RegistrationsController < Devise::RegistrationsController
def create
if Team.where(code: params[:user][:team_code]).exists?
super
if current_user
current_user.team = Team.find_by_code(params[:user][:team_code])
current_user.save!
end
else
redirect_to new_user_registration_path, :flash => { :error => "Team code invalid" }
end
end
protected
def after_sign_up_path_for(resource)
UserSession.create(user_id: current_user.id, login_time: DateTime.now, last_action_time: DateTime.now, num_team_members: params[:user][:num_team_members])
root_path
end
end
user_model
class User < ApplicationRecord
belongs_to :team, optional: true
has_many :readiness_factor_responses, dependent: :destroy
has_many :user_sessions, dependent: :destroy
has_many :activity_plan_users, dependent: :destroy
# Include default devise modules. Others available are:
# :confirmable, :lockable, :trackable and :omniauthable
devise :database_authenticatable, :registerable, :timeoutable,
:recoverable, :rememberable, :trackable, :validatable
validates :username,
presence: true,
length: { minimum: 2 }
attr_accessor :team_code
attr_accessor :num_team_members
attr_accessor :accept_terms
def is_admin?
self.admin
end
def step_and_substep
[self.current_step, self.current_substep]
end
def current_session
# weak way to handle the case where other teammates have signed up but not logged in
if self.user_sessions
self.user_sessions.order("created_at").last
else
nil
end
end
# user is defined as idle if they haven't taken an action in 30 min. They will also be forced to reauth by devise
def is_idle?
if self.current_session && self.current_session.last_action_time
(Time.now - self.current_session.last_action_time) > 1800
end
end
end