Как реализовать перенаправление на все запросы (при определенных условиях)?
-
01-07-2019 - |
Вопрос
Я хочу настроить что-то так, чтобы, если учетная запись в моем приложении отключена, я хотел, чтобы все запросы перенаправлялись на «отключенное» сообщение.
Я установил это в своем ApplicationController:
class ApplicationController < ActionController::Base
before_filter :check_account
def check_account
redirect_to :controller => "main", :action => "disabled" and return if !$account.active?
end
end
Конечно, это не совсем работает, поскольку если учетная запись не активна, происходит бесконечный цикл.Я надеялся использовать что-то вроде:
redirect_to :controller => "main", :action => "disabled" and return if !$account.active? && @controller.controller_name != "main" && @controller.action_name != "disabled"
но я заметил, что в Rails v2.1 (то, что я использую) @controller теперь является контроллером, и это, похоже, не работает в ApplicationController.
Как лучше всего реализовать что-то подобное?
Решение
Вы также можете использовать skip_before_filter
для одного контроллера/метода, к которому вы не хотите применять фильтр.
Другие советы
У вас есть несколько вариантов.
Если ваш метод действия «отключен» имеет уникальное имя в области приложения, вы можете добавить исключение к вызову before_filter, например:
before_filter :check_account, :except => :disabled
Если вы хотите проверить конкретно контроллер и действие в фильтре, обратите внимание, что этот код уже является частью объекта контроллера.Вы можете называть его «я», вот так:
def check_account
return if self.controller_name == "main" && self.action_name == "disabled"
redirect_to :controller => "main", :action => "disabled" and return if !$account.active?
end
Наконец, если хотите, вы можете перезаписать метод фильтра из MainController.rb:
def check_account
return if action_name == "disabled"
super
end
Как насчет того, чтобы сначала избавиться от глобальной переменной $account.По сути, вы настраиваете себя на серьезные ошибки, используя глобальный файл.Просто используйте переменную экземпляра вместо @ или, еще лучше, создайте в ApplicationController метод под названием current_account, который обращается к переменной экземпляра @current_account.
Если переопределений не слишком много, просто добавьте if в фильтр перенаправления.
Если действие! = отключен redirect () end