Перенаправление разработки при успешном входе в систему, кажется, застревает при первой попытке входа - PullRequest
6 голосов
/ 21 июня 2020

Я разрабатываю небольшое приложение, используя Ruby на Rails и использую Devise для аутентификации. У меня две настройки систем входа, одна - user, а другая - employee

. При входе в систему с использованием правильного адреса электронной почты и пароля, devise отправляет правильное перенаправление на обратный путь, но застревает там. Ничего не будет продолжаться, пока я не обновлю sh страницу. Но как только я обновлю sh его, он с радостью перейдет на go путь перенаправления, и даже если после выхода из той же вкладки браузера и последующего входа в систему работает. Но если я закрою вкладку, а затем загружу приложение в новой вкладке, это не сработает.

Ниже приведен вывод сервера rails при входе в систему,

Started POST "/employees/sign_in" for ::1 at 2020-06-21 18:21:50 +0530
Processing by Devise::SessionsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"Pr0k+3+FfU72BcwTVRhWxQYBTD/zcv5+QBdWuovDRd4+yGxC1OBWmvAscWJbnog2vVTLpbPM2xOwVxGC3UsLRg==", "employee"=>{"email"=>"employee@example.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"}
  Employee Load (0.4ms)  SELECT  "employees".* FROM "employees" WHERE "employees"."email" = $1 ORDER BY "employees"."id" ASC LIMIT $2  [["email", "employee@example.com"], ["LIMIT", 1]]
  ↳ app/controllers/application_controller.rb:23
  CACHE Employee Load (0.0ms)  SELECT  "employees".* FROM "employees" WHERE "employees"."email" = $1 ORDER BY "employees"."id" ASC LIMIT $2  [["email", "employee@example.com"], ["LIMIT", 1]]
  ↳ app/controllers/application_controller.rb:23
Redirected to http://localhost:3000/employee/dashboard
Completed 302 Found in 818ms (ActiveRecord: 0.4ms)

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

Ниже приведен код моей функции after_sign_in_path

  def after_sign_in_path_for(resource)
    set_flash_message! :alert, :warn_pwned if resource.respond_to?(:pwned?) && resource.pwned?
    set_root
    # super
  end

Здесь функция set_root возвращает Строка с путем для перенаправления.

Информация о версии

Ruby version - ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-darwin19]
Rails version - Rails 5.2.4.2
Devise version - 4.7.1
Turbolinks - Yes

Ответы [ 3 ]

3 голосов
/ 19 июля 2020

Попробуйте заменить form_for на form_with в sessions/new.html.erb. У меня похожая проблема (Rails 6), и теперь все в порядке.

<%= form_with(model: resource, scope: resource_name, url: session_path(resource_name)) do |f| %>

Кроме того, я раскомментировал раздел Turbolinks в config/initializers/devise.rb:

ActiveSupport.on_load(:devise_failure_app) do
  include Turbolinks::Controller
end
3 голосов
/ 28 июня 2020

Это похоже на проблему с вашим интерфейсом (точнее, Turbolinks), а не с серверной частью. Как видно из вашего журнала, перенаправление на самом деле происходит с точки зрения HTTP.

Поскольку я сам не сталкивался с этой проблемой (в основном потому, что я не часто использовал Turbolinks в более сложных приложениях), я могу только указать к нескольким ресурсам, в которых описываются проблемы, похожие на вашу, а именно:

Я надеюсь, что один из этих двух поможет.

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

1 голос
/ 30 июня 2020

Первое, что я бы попробовал, - это вернуть redirect_to:

def after_sign_in_path_for(resource)
  set_flash_message! :alert, :warn_pwned if resource.respond_to?(:pwned?) && resource.pwned?
  return redirect_to set_root
  # super
end
...