Фильтры/обратные вызовы должны быть в проблемах или нет

#ruby-on-rails #actioncontroller #activesupport-concern

Вопрос:

Допустим, у меня есть проблема с контроллерами, и ее название-аутентификация. Он содержит метод before_action authenticate_user. Где я должен написать перед действием :authenticate_user? какова наилучшая практика? Должно ли это быть написано в отношении или в контроллере, в который включена эта проблема?

ПРИМЕЧАНИЕ: Я хочу реализовать единую ответственность

Ответ №1:

Это зависит от структуры вашего контроллера. Логика аутентификации чаще всего размещается в контроллере более высокого уровня, от которого в конечном итоге наследуется большинство других контроллеров, а не проблема. Это связано с тем, что вы можете просто включить проверку подлинности на более высоком уровне и активировать ее на всех субконтроллерах без необходимости явно добавлять проблему для каждого из них, что может быть более подвержено ошибкам. Этот контроллер более высокого уровня будет содержать и before_action метод, и authenticate_user метод. Если по какой-либо причине на этом пути есть контроллер, который нуждается в отключении аутентификации, предполагая, что это будет исключением, вы можете использовать skip_before_action .

 class UserController < ApplicationController
    before_action :authenticate

    private

    def authenticate
        # ...
    end
end

class SomeController < UserController
    # auth already enabled here
end
 

Комментарии:

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

2. Это нормально, если исключить логику, ApplicationController чтобы она была чище и понятнее.