Передача запросов рельсов через серию контроллеров? - PullRequest
0 голосов
/ 29 октября 2018

Вопрос обобщен, но я хочу спросить о конкретном случае, который хочу решить.

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

Проблема

Перед каждым действием в любом контроллере мы проверяем, принадлежит ли пользователь определенному типу: Guest, Signed-In или Admin, а также разрешен ли пользователю доступ к этому действию в зависимости от типа. Если все условия соблюдены, то действие выполняется. И это происходит в большинстве действий большинства контроллеров.

Мое мышление

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

Мое решение, которое может или не может быть возможно

Мы можем сделать SessionsController (или другое имя) и позволить ему обрабатывать часть аутентификации и авторизации. Но я хочу, чтобы SessionsController выполнял свою работу автоматически перед каждым запросом. Т.е. Каждый запрос должен проходить через SessionsController, и тогда этот контроллер решит, переслать ли запрос соответствующему контроллеру.

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

1 Ответ

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

Звучит как идеальный пример, в котором можно использовать один или несколько before_action. Вы можете поместить before_action в свой ApplicationController:

# in app/controllers/application_controller.rb
private
def authorize_admin
  render status: 401 unless current_user? && current_user.admin?
end

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

# in any controller - even the ApplicationController
before_action :authenticate

Вы можете настроить before_action на запуск только при определенных условиях или при определенных действиях. Просто посмотрите, как использовать Фильтры в Rails Guides .

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