Devise устанавливает для current_user значение nil после того, как я изменю пароль этого пользователя и снова войду в систему

Вот код, который я пытаюсь использовать в своем контроллере:

profiles_controller.rb:

class ProfilesController < ApplicationController
  ...


  def update

    respond_to do |format|
      # assume valid data sent (I've already tested for this)
      if @user.update(user_params)
        # password_reset? check's parameter passed to action that a check box was
        # checked (which enables/disables password/confirmation fields. If unchecked,
        # fields are disabled and no password parameters are sent to this action.
        # @user was set to current_user in a before_action already
        # inspecting @user at this point returns the same thing as current_user here
        sign_in(:user, @user) if password_reset?
        # current_user is still set to @user and is valid

        # after redirection current_user becomes nil
        format.html {
          redirect_to home_path, notice: 'Your profile was successfully updated.'
        }
      else
        format.html { render :edit }
      end
    end
  end
  ...
private
  # Never trust parameters from the scary internet, only allow the white list through.
  def user_params
    @user_params ||= params.require(:user).permit(:first_name, :last_name, :email, :phone, :password, :password_confirmation, :reset_password)
  end

  def password_reset?
    @user_params["reset_password"] == "1"
  end
end

application_controller.rb:

class ApplicationController < ActionController::Base
...

private
...
  def require_user
    logger.debug "IN REQUIRE_USER, CURRENT_USER IS: #{current_user.inspect}"
    unless current_user
      store_location
      redirect_to new_user_session_url, notice: "That url doesn't exist."
      return false
    end
  end

  def require_admin
    # this line will actually log a user in
    #sign_in(:user, User.first) unless current_user
    logger.debug "IN REQUIRE_ADMIN, CURRENT_USER IS: #{current_user.inspect}"
    unless current_user && current_user.is_admin?
      redirect_to(home_path, notice: "That url doesn't exist.") and return false
    end
  end
...
end

журнал разработки:

Started PATCH "/profile" for 127.0.0.1 at 2019-05-28 10:38:45 -0700
Processing by ProfilesController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"....", "user"=>{....}, "commit"=>"Update Profile"}
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/application_controller.rb:47
IN REQUIRE_USER, CURRENT_USER IS: #<User id: 1 ....>
   (0.1ms)  begin transaction
  ↳ app/controllers/profiles_controller.rb:16
  User Exists (0.4ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) AND "users"."id" != ? LIMIT ?  [["email", "...."], ["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/profiles_controller.rb:16
  User Update (0.3ms)  UPDATE "users" SET "encrypted_password" = ?, "updated_at" = ? WHERE "users"."id" = ?  [["encrypted_password", "$2a$11...."], ["updated_at", "2019-05-28 17:38:45.346414"], ["id", 1]]
  ↳ app/controllers/profiles_controller.rb:16
   (2.3ms)  commit transaction
  ↳ app/controllers/profiles_controller.rb:16
PASSWORDS PASSED IN SO USER PASSWORD CHANGE OCCURRED
REDIRECTING TO HOME PATH
Redirected to http://localhost:3000/admin
Completed 302 Found in 121ms (ActiveRecord: 3.2ms)


Started GET "/admin" for 127.0.0.1 at 2019-05-28 10:38:45 -0700
Processing by Admin::PagesController#index as HTML
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/application_controller.rb:65
IN REQUIRE_ADMIN, CURRENT_USER IS: nil
Redirected to http://localhost:3000/
Filter chain halted as :require_admin rendered or redirected
Completed 302 Found in 2ms (ActiveRecord: 0.2ms)


Started GET "/" for 127.0.0.1 at 2019-05-28 10:38:45 -0700
Processing by PagesController#index as HTML
  Rendering pages/index.html.erb within layouts/application
  Rendered pages/index.html.erb within layouts/application (0.7ms)
  Rendered application/_navigation.html.erb (1.7ms)
  Rendered application/_alert.html.erb (0.3ms)
Completed 200 OK in 1152ms (Views: 1151.2ms | ActiveRecord: 0.0ms)

Я искал вокруг и видел, что by_pass: true передается sign_in, но это не помогает. Я также пробовал @current_user = @user после того, как зарегистрировал пользователя (@current_user — это прямая переменная экземпляра для контроллера Devise, кстати), и это тоже не помогает.

Есть идеи?

Я дал полное объяснение в комментарии выше этой строки того, что он делает и не вызывает проблемы. Я отредактирую свой код, чтобы показать вам, что показывать его не нужно.

aarona 28.05.2019 20:36

Я даже поместил этот код в блок if password_reset?. Поверьте, дело не в этом. Я ценю вопрос, хотя.

aarona 28.05.2019 20:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
476
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Devise игнорирует вход, если пользователь уже вошел в систему, попробуйте:

if @user.saved_change_to_encrypted_password? # for rails 5+, for previous - .encrypted_password_changed?
  sign_in @user, force: true
end

Выдающийся! force: true сделал это за меня, спасибо!

aarona 28.05.2019 21:51

Вы можете войти в новый сеанс, если пользователь уже вошел в систему.

Девайс сказал

# Sign in a user bypassing the warden callbacks and stores the user
# straight in session. This option is useful in cases the user is 
# signed in, but we want to refresh the credentials in session.

Пожалуйста, используйте, как показано ниже.

bypass_sign_in(@user)

Другие вопросы по теме