Параметры Rails Devise не записываются в БД (только на сервере) - PullRequest
0 голосов
/ 30 января 2020

Я поддерживаю приложение 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
...