Before_action вызывает слишком много перенаправлений - PullRequest
0 голосов
/ 29 октября 2018

Мне интересно, что было бы лучшим способом справиться со следующим:

У меня есть метод аутентификации (используемый как before_action), который проверяет, присутствует ли user_id в сеансе, когда запрашивается страница входа. Если обнаружен идентификатор_пользователя, он перенаправляет пользователя на путь к панели мониторинга.

def already_validated
    if session[:uid] == user.id
        redirect_to dash_path
    end
end

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

Мой вопрос: как лучше всего справиться с этим типом установки? Есть ли способ в рельсах, чтобы оценить только на первом перенаправлении? Я думал об использовании временного флага, чтобы сказать, если перенаправление произошло раньше. Это не кажется очень элегантным. Я уверен, что есть более простой / лучший способ справиться с этим.

Спасибо за любой совет, который вы можете дать.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

На вашем before_action должно быть исключение: вы не хотите вызывать его на dash_path. Если пользователь входит туда и проверяется, он должен оставаться там (как это сделал бы redirect), а если он не подтвержден, он должен просто оставаться там (как и с любым другим URL-адресом, который не проходит этот процесс проверки).

Нет смысла проверять, подтвержден ли он, поскольку в результате всегда будет оставаться на той же странице.

Затем в вашем контроллере вы должны указать, что вы хотите исключение для before_action:

class SomeController < ApplicationController
  before_action: :already_validated, except: [:dash_action]

  def is_validated_action # the method that causes the redirect
  end 

  def dash_action # action of dash_path url
  end

  def already_validated
    if session[:uid] == user.id
        redirect_to dash_path
    end
  end
end

Если вам нужна некоторая проверка before гипотетического dash_action, то создайте для него новый метод. Убедитесь, что у вас нет циклических ссылок, иначе в долгосрочной перспективе отладку будет довольно сложно.

0 голосов
/ 29 октября 2018

Вы можете просто указать Rails пропустить фильтр before в контроллере, который обрабатывает dash_path:

# in the controller
skip_before_action :already_validated

Читать о Фильтры в направляющих рельсов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...