Как заставить 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

Надеюсь, это поможет вам!