Несколько перенаправлений после обновления пользователя с помощью devise - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь создать в rails 5 приложений с устройством, которое должно работать как социальная сеть, поэтому у каждого пользователя есть свой профиль.После обновления пользователя вместо возврата к профилю сервер перенаправляет на локальный хост, затем появляется сообщение Filter chain halted as :require_no_authentication rendered or redirected, и только после этого загружается профиль пользователя.Также в профиле отображается сообщение «Вы уже вошли в систему».Моя цель - стереть эти перенаправления.

  1. Я пытался изменить перенаправление в пользовательском RegistrationController, но потом было сказано, что перенаправлений слишком много, поэтому я не могу его просто заменить.
  2. Я пытался получить разные корни для аутентифицированных и не прошедших проверку пользователей в routes.rb, но это не изменило поведение
  3. Я пытался отстать от :require no authentication, но на самом деле я не совсем уверенпонял это правильно, а также ничего не изменило.
  4. after_sign_in_path_for настроен на профиль пользователя

Это вывод сервера:

Started PUT "/users" for 127.0.0.1 at 2019-06-04 12:13:37 +0200
Processing by Users::RegistrationsController#update as HTML
  Parameters: {"email"=>"asdf@asdf.de", "password"=>"[FILTERED]", "password_confirmat
ion"=>"[FILTERED]", "current_password"=>"[FILTERED]"}, "commit"=>"Update"}
User Load (0.8ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1
User Load (0.6ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT
 1
   (0.3ms)  BEGIN
   (0.4ms)  COMMIT
Redirected to http://localhost:3000/
Completed 302 Found in 295ms (ActiveRecord: 2.1ms)


Started GET "/" for 127.0.0.1 at 2019-06-04 12:13:37 +0200
Processing by Users::SessionsController#new as HTML
  User Load (0.7ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER
 BY `users`.`id` ASC LIMIT 1
Redirected to http://localhost:3000/users/1
Filter chain halted as :require_no_authentication rendered or redirected
Completed 302 Found in 15ms (ActiveRecord: 0.7ms)


Started GET "/users/1" for 127.0.0.1 at 2019-06-04 12:13:37 +0200
Processing by UsersController#show as HTML
  Parameters: {"id"=>"1"}
  User Load (0.6ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER
 BY `users`.`id` ASC LIMIT 1
  User Load (0.5ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT
 1
  Rendering users/show.html.erb within layouts/application
  Rendered users/show.html.erb within layouts/application (1.1ms)
  Rendered shared/_navbar.html.erb (0.7ms)
Completed 200 OK in 162ms (Views: 145.3ms | ActiveRecord: 1.1ms)

Кроме того, почему пользователь снова регистрируется после обновления?Это правильное поведение?Я не могу понять, где происходит перенаправление на localhost, и вмешиваться.Буду признателен за любую помощь.

Редактировать 1

Итак, чтобы уточнить.Я пытался использовать authenticated_root, но затем я получаю сообщение об ошибке Couldn't find User without an ID.

devise_scope :user do

authenticated :user do
    root to: 'users#show', as: :authenticated_root
  end
  root to: 'users/sessions#new'
end

Также мне не удается изменить перенаправление с root на профиль пользователя.Таким образом, RegistrationController без изменений.Я хотел бы сказать в методе обновления или где-то еще "после обновления перейдите в профиль пользователя".

Ответы [ 3 ]

0 голосов
/ 05 июня 2019

Мне удалось решить эту проблему, добавив метод к RegistrationController следующим образом:

def after_update_path_for(resource)
  user_path(current_user)
end
0 голосов
/ 06 июня 2019

То есть после обновления пользователя Rails переходит в root_path, то есть sessions#new. Но пользователь уже вошел в систему, поэтому маршрутизатор rails перенаправляет вас на users#show

Почему бы вам не установить root "home#index" (или что-то подобное)

Rails.application.routes.draw do
  devise_for :users

  authenticated :user do
    root 'secret#index', as: :authenticated_root
  end

  root "home#index"
end

, а затем в вашем application_controller.rb вы можете просто потребовать от пользователей войти в систему, прежде чем использовать вашу страницу

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :authenticate_user!
end

Если вы хотите перенаправить пользователя на users#show после обновления, вы можете переопределить after_update_path_for

class User::RegistrationsController < Devise::RegistrationsController

  protected

  def after_update_path_for(resource)
    user_path(resource)
  end
end
0 голосов
/ 04 июня 2019

Похоже, ваш root_path равен /users/sign_in, и когда пользователь обновляет свою учетную запись, вы перенаправляете его в корневой каталог ... но пользователь уже вошел в систему, поэтому он не может получить доступ к new_user_session_pah,Резервное местоположение по умолчанию, настроенное в Devise, - это профиль пользователя, поэтому он перенаправляется на этот маршрут.

Вы настроили аутентифицированный root?https://github.com/plataformatec/devise/wiki/How-To:-Define-a-different-root-route-for-logged-in-out-users

Это должно решить вашу проблему (:

...