Как применить before_filter к каждому действию каждого контроллера в Rails 3.2.11?

Я хочу проверить, зарегистрирован ли пользователь на каждом отдельном запросе на сервер.

Что-то вроде:

:before_filter verify_logged_in

Где я должен поместить этот файл before_filter, чтобы он применялся ко всем действиям контроллера и всем запросам?

Ответ 1

Чтобы гарантировать, что фильтры применяются ко всем действиям, поместите их в application_controller.rb.

Ответ 2

Application Controller - это базовый класс всех других классов.

Если вы помещаете какой-либо фильтр в этот класс, поток работает следующим образом:

Если вы нажмете url на ресурс users с любым действием, скажите index действие, то:

Элемент управления сначала переходит в Application Controller. Там он проверяет фильтры, если находит, то он выполняет метод фильтра, после чего он переходит к индексированию действия контроллера пользователей.

Контроллер приложений:

class ApplicationController < ActionController::Base
  protect_from_forgery

  before_filter :verify_logged_in

end

Другой контроллер:

class UsersController < ApplicationController

  def index

  end

Здесь в приведенном выше коде вы видите, что другой контроллер наследует содержимое родительского контроллера, который является прикладным контроллером. Поэтому, если вы поместите before_filter в контроллер приложения, то для каждого пользователя он проверяет, зарегистрирован ли пользователь для каждого запроса.

Ответ 3

поместите before_filter в базовый класс (в файл application_controller.rb), он будет работать на основе и всех его производных классах, таких как

class ApplicationController < ActionController::Base
  before_filter :set_locale

  def set_locale
    I18n.locale = params[:locale] or I18n.default_locale
  end
end

удачи: -)

Ответ 4

Поместите его в ApplicationController и наследуйте от него все остальные контроллеры. Если вы не перезаписываете verify_logged_in в одном из ваших субконтроллеров, он просто работает.