Как заставить before_action работать на всех контроллерах и действиях, кроме одного?
У меня есть приложение rails 4.2.x, с установкой для аутентификации - у меня есть несколько контроллеров.
Я хочу, чтобы devent authenticate_user! метод, который должен выполняться на всех контроллерах и действиях, за исключением действия индекса контроллера домашнего устройства. (Конечно, authenticate_user! Сам позаботится о том, чтобы разработать такие действия, как вход в систему)
Я могу гарантировать, что каждое действие контроллера запускает before_action в application_controller.rb:
class ApplicationController < ActionController::Base
before_action :authenticate_user!
...
end
Я также могу ограничить определенный набор действий для всех контроллеров:
class ApplicationController < ActionController::Base
before_action :authenticate_user!, except: [:index]
...
end
Но я не вижу, как сделать исключение только для home/index.
Я мог бы, конечно, вручную добавить before_action :authenticate_user!
к каждому контроллеру и добавить исключение к домашнему контроллеру для действия индекса. Но это не очень сухо, и если я добавлю новые контроллеры, мне нужно не забыть добавлять это before_action к каждому из них.
Ответы
Ответ 1
Что вам нужно сделать, так это установить autheticate_user! на всех таких контроллерах:
class ApplicationController < ActionController::Base
before_action :authenticate_user!
...
end
И затем на вашем HomeController вы выполните следующее:
class HomeController < ApplicationController
skip_before_action :authenticate_user!, only: [:index]
...
end
Надеюсь, это поможет вам!